Bac général Spé NSI 2026 Sujet 2 [Corrigé]

News09 Juil 2026

Ce mercredi 17 juin, les candidats du baccalauréat général ont dû se pencher sur l'épreuve de NSI. Le sujet se composait de 3 exercices indépendants. Voici une copie corrigée proposée en exclusivité par MyStudies !

Bac général Spé NSI 2026 Sujet 2 [Corrigé]
  • Sujet disponible ici


Exercice 1 -  Les réseaux et la programmation orientée objet

1. Déterminer l’adresse IP du réseau local dédié au site C.

Adresse IP du réseau local : 172.16.0.0.

2. Déterminer l’adresse IP de diffusion du réseau local dédié au site C.

Adresse IP de diffusion : 172.16.255.255.

3. Donner le nombre maximal de machines que l’on peut connecter sur le réseau local dédié au site C, y compris les machines déjà présentes.

Nombre maximal de machines : 2^16 - 2 (on retire les 2 IP réservées)

Cela fait 65 534 IP (valeur non demandée sur la copie puisque la calculatrice est interdite) 

4. Recopier et compléter la table de routage du routeur R1 obtenue avec le protocole RIP

Destination

Passe par

Nombre de sauts

R2

R3

2

R3

R3

1

R4

R4

1

R5

R4

2

5. Déterminer le chemin que suit un paquet envoyé depuis PC A01 (Site A, relié à R1) vers PC B01 (Site B, relié à R2) en supposant qu’on utilise le protocole RIP.

Chemin : PC A01 → R1 → R3 → R2 → PC B01.

6. Déterminer la nouvelle route qu’un paquet peut suivre de R1 à R2 si le routeur R3 tombe en panne, toujours en supposant qu’on utilise le protocole RIP.

Si R3 est en panne, le nouveau chemin est : PC A01 → R1 → R4 → R5 → R2 → PC B01.

7. Recopier et compléter le tableau suivant donnant le coût pour le protocole OSPF des liaisons réseau selon leur type de connexion.

Connexion

Débit

Coût

Ethernet

10^7

10

Fast Ethernet

10^8

1

Fibre

10^9

0,1

8. Déterminer, en justifiant, le chemin choisi par le protocole OSPF entre R1 et R4.

Le protocole OSPF vise à limiter les coûts. D'après la question précédente, on privilégiera la fibre à ethernet. On choisit alors le chemin R1 → R3 → R4, d'un coût de 1,1.

9. Justifier que le code proposé ci-dessus ne permet pas de s’assurer que la contrainte d’un nombre maximal de routes contenues dans la liste est respectée.

La constante MAX_ROUTES n'est jamais vérifiée par le code avant l'ajout d'une route.

10. Recopier et compléter les lignes 3, 7, 8 et 10 du code ci-dessus pour respecter les contraintes de la classe.

Ligne 3 :  self.capacite = capacite
Ligne 7 : if len(self.routes) < self.capacite:
Ligne 8 : self.routes.append(route)
Ligne 10 : print("Capacité maximale atteinte")

11. Écrire une méthode afficher de la classe Routage qui affiche toutes les routes présentes dans la liste routes. 

def afficher(self):
    for route in self.routes:
        for routeur in route:
            print(routeur)
        print("---")

Exercice 2 - La mise au point de programme, la gestion des bugs et les graphes

Partie A - Mélange aléatoire

1. Donner la valeur de melangee[2][1].

melangee[2][1] =10

Explication : La ligne d’indice 2 est [2, 10, 9, 4]. La valeur d’indice 1 est donc 10.

2. Réécrire cette instruction en la corrigeant pour que la liste valeurs contienne bien les entiers de 1 à 16.

valeurs = [k for k in range(1, 17)].

Explication : L’instruction "range(16)" produit les entiers de 0 à 15. Or, on veut les entiers de 1 à 16. 

3. Proposer une modification de la ligne valeurs = shuffle(valeurs) afin de corriger cette erreur.

shuffle(valeurs)

Explication : La fonction shuffle ne renvoyant à rien, il ne faut pas affecter son résultat à valeurs.

4. Recopier et compléter la ligne 2 de cette fonction afin qu’elle vérifie que la liste passée en paramètre contient le bon nombre d’éléments.

assert len(valeurs) == n * n

5. Recopier et modifier la ligne 6 de la fonction en_grille afin de corriger cette erreur.

grille[i][j] = valeurs[i * n + j]

Explication : Pour remplir la grille ligne par ligne, l’élément placé en ligne i et colonne j doit être valeurs [i * n + j].

Partie B - Grille résoluble

6. Indiquer si la grille représentée en machine par la liste suivante est résoluble ?

Grille étudiée : [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 16, 15, 14]]

Liste aplatie : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 15, 14].

Inversions : 3 (16 > 15, 16 > 14 et 15 > 14)

Distance : 2 (La tuile vide 16 est à la position ligne 3, colonne 1. Sa position finale est ligne 3, colonne 3)

Somme : 3 + 2 = 5 = nombre impair. La grille n’est donc pas résoluble.

7. Proposer un test faisant intervenir une liste aplatie de quatre éléments et comptant deux inversions permettant de vérifier que la fonction compte_inversions renvoie le résultat attendu.

Exemple de test possible avec 4 éléments et 2 inversions : assert compte_inversions([6, 9, 7, 8]) == 2

8. La fonction proposée ne passe pas les tests. Proposer une correction de la fonction compte_inversions.

Identification du problème : la fonction initiale compare tous les couples d’indices, y compris ceux pour lesquels i ≥ j, alors qu'il faut seulement compter les couples (i, j) tels que i < j.

Solution : Ligne 4 = for j in range(i + 1, len(valeurs))

9. Recopier et compléter les lignes 5 et 6 de cette fonction afin qu’elle renvoie la distance attendue.

Ligne 5 : if grille[i][j] == n*n

Ligne 6 : return (n - 1 - i) + (n - 1 - j)

10. Recopier et compléter cette fonction afin qu’elle renvoie la valeur attendue. On rappelle que 7 % 2 est égal à 1 alors que 8 % 2 est égal à 0.

Ligne 3 : inv = compte_inversions(valeurs)
Ligne 4 : dis = distance_tuile_vide(grille, n)
Ligne 5 : return (inv + dis) % 2 == 0

Partie C - Mélange réaliste

11. Donner une valeur possible de graphe_4_4[9] en supposant que graphe_4_4 est la liste d’adjacence représentant le graphe associé à une grille à 4 lignes et 4 colonnes.

Dans une grille 4 x 4, les indices sont disposés ainsi :

0123
4567
891011
12131415

L’indice 9 a pour voisins les indices 5, 8, 10 et 13. Donc graphe_4_4[9] = [5, 8, 10, 13]

12. Recopier et compléter les lignes 7 à 10 de la fonction melange_graphe.

Ligne 7 : for k in range(nb_dep):

Ligne 8 : prochaine = choice(graphe[actuelle])
Ligne 9 : valeurs[actuelle] = valeurs[prochaine]
Ligne 10 : valeurs[prochaine] = num_tuile_vide
Explication : À chaque déplacement, on choisit une case voisine de la position actuelle de la tuile vide. On échange ensuite les deux valeurs dans la liste aplatie.

Exercice 3 - Les bases de données et les structures de file et de graphe

Partie A

1. Expliquer pourquoi les attributs nom et prenom n’ont pas été retenus comme clé primaire de la table utilisateur.

Deux personnes peuvent avoir la même combinaison de nom + prénom. Or, une clé primaire doit identifier chaque utilisateur de façon unique. Les attributs nom et prénom ne conviennent donc pas comme clé primaire.

2. Justifier que les attributs de la relation inscription sont aussi des nombres entiers.

Dans la relation inscription, les attributs trajet et passager pointent vers les clés étrangères id_trajet et id_utilisateur, qui sont tous deux des entiers. Les attributs trajet et passager sont donc aussi des entiers.

3. Recopier et compléter la requête suivante afin de connaître le nombre de passagers inscrits sur le trajet n° 1291.

SELECT COUNT(*)

FROM inscription
WHERE trajet = 1291;

4. Écrire une requête permettant d’obtenir la liste des trajets qui arrivent à Nancy le 19 juin 2026 dans l’ordre croissant de l’heure de départ.

SELECT *

FROM trajet
WHERE arrivee = 'Nancy'
  AND heure > '2026-06-19 00:00:00'
  AND heure < '2026-06-20 00:00:00'
ORDER BY heure;

5. Écrire une requête qui aurait permis d’ajouter le trajet n°1295 dans la base de données lors de sa création.

INSERT INTO trajet
VALUES (1295, 'Nancy', 'Allain', '2026-06-19 17:45:00', 3, 25);

6. Écrire une requête permettant de modifier l’heure de départ à 18h40 pour le trajet n°1294. On pourra utiliser les valeurs présentes dans les tableaux extraits de la base de données.

UPDATE trajet
SET heure = '2026-06-19 18:40:00'
WHERE id_trajet = 1294;

7. Expliquer en détail les raisons de cette erreur.

La suppression du trajet n°1296 a échoué à cause d'une contrainte de clé étrangère. Il est en effet lié à des inscriptions : dans la table inscription, il existe une ligne pour ce trajet, et le passager 18 y est inscrit. Supprimer directement la ligne de trajet laisserait une inscription sans référence de trajet. Il faut donc d'abord supprimer ou rediriger les inscriptions associées.

8. Écrire une requête permettant d’obtenir la liste des noms et prénoms des passagers transportés au moins une fois par l’utilisatrice dont l’identifiant est 25.

SELECT DISTINCT utilisateur.nom, utilisateur.prenom
FROM utilisateur
JOIN inscription ON utilisateur.id_utilisateur = inscription.passager
JOIN trajet ON inscription.trajet = trajet.id_trajet
WHERE trajet.conducteur = 25;

Partie B 

9. Écrire un dictionnaire Python représentant le graphe de la Figure 2. 

graphe = {
    'A': ['P1', 'P2', 'P3'],
    'M': ['P2', 'P3', 'V'],
    'C': ['P1', 'P2'],
    'V': ['M'],
    'P1': ['C', 'A'],
    'P2': ['C', 'A', 'M'],
    'P3': ['A', 'M']
}

Explication : Le graphe de la figure peut être représenté par un dictionnaire d'adjacence. L'ordre des voisins n'a pas d'importance.

10. Rappeler le principe de fonctionnement d’une file.

Une file fonctionne selon le principe FIFO (First In First Out), c'est-à-dire que le premier élément inséré est le premier élément extrait, et ainsi de suite.

11. Donner un ordre possible d’insertion des sommets dans la file lorsqu’on applique la fonction dico_distance sur le graphe de la Figure 2 avec le sommet P1 pour sommet de départ.

Ordre possible : P1, C, A, P2, P3, M, V

12. Donner le nom du type de parcours de graphe, utilisé dans la fonction dico_distance.

La fonction dico_distance effectue un parcours en largeur, c'est-à-dire qu'elle utilise une file pour explorer les sommets par distance croissante depuis le sommet de départ.

13. Recopier et compléter la fonction excentricite suivante qui calcule l’excentricité d’un sommet dans un graphe.

Ligne 7 : plus_grande = 0

Ligne 8 : for s in dico:
Ligne 9 : if dico[s] > plus_grande:
Ligne 10 : plus_grande = dico[s]
Ligne 11 : return plus_grande

Explication : On calcule l'excentricité en parcourant les distances obtenues avec dico_distance, sans utiliser max.

14. Donner, en le justifiant avec un indicateur, le meilleur point de rendez-vous pour ces quatre personnes (Alice, Maxime, Valérie et Clément).

On compare les excentricités des trois points de rendez-vous possibles P1, P2 et P3 :

Point

Distances utiles

Excentricité

P1

A : 1, C : 1, M : 3, V : 4

4

P2

A : 1, C : 1, M : 1, V : 2

2

P3

A : 1, M : 1, V : 2, C : 3

3

 Le meilleur point de rendez-vous est donc P2 : c'est pour lequel la personne la plus éloignée aura le moins de distance à parcourir.

Un exercice à résoudre en NSI ?

Demandez un accompagnement sur mesure !
NOUVEAU

MyStudies, le site qui t'aide à réviser

Fiches de révision instantanées, quiz personnalisés et entraînement sur mesure pour réussir tes examens, oraux et présentations.

Demande à l'assistant IA

Obtiens des explications et de l’aide pour progresser avec confiance.

Poser une question

Lance un quiz personnalisé

Révise et retiens les informations sans effort.

Commencer un quiz

Crée des fiches de révision

Apprends plus facilement avec des fiches claires et structurées.

Créer mes fiches
Gagne du tempsTout ce dont tu as besoin, prêt pour toi !
Progresse à ton rythmeDes outils adaptés à ton niveau.
Atteins tes objectifsExamens, oraux : on t’aide !