Corrigé NSI Antilles 2026 – Jour 2
Bac 2026 • Spécialité NSI • Antilles-Guyane

Corrigé NSI Antilles 2026 – Jour 2

Ce corrigé NSI Antilles 2026 jour 2 reprend l’intégralité du sujet : bases de données, requêtes SQL, programmation objet, protocoles RIP et OSPF, graphes, parcours en largeur, dictionnaires, récursivité et programmation dynamique. L’objectif est de montrer non seulement la réponse, mais surtout la méthode attendue dans une copie de bac.

SQL Programmation objet RIP / OSPF Graphes Dictionnaires Programmation dynamique
Tous les sujets NSI Accueil Fiches NSI — en préparation Lexique NSI — en préparation
Illustration du corrigé NSI Antilles-Guyane 2026 jour 2

Analyse du sujet NSI Antilles-Guyane 2026 jour 2

Le sujet est équilibré : d’abord un exercice très classique sur le modèle relationnel, SQL et la programmation objet ; ensuite un exercice de réseaux qui oblige à distinguer clairement une métrique en nombre de sauts et une métrique en coût ; enfin un exercice d’algorithmique sur un problème proche du découpage optimal de planches. Ainsi, il couvre les grands piliers du programme de terminale NSI : données, algorithmes, langages, machines et réseaux.

Pour réussir, il faut rédiger avec précision. En SQL, il faut nommer correctement les tables et les attributs. En Python, il faut respecter les effets de bord demandés : certaines fonctions doivent modifier un dictionnaire existant, et non en créer un nouveau. Enfin, dans les graphes, il faut toujours préciser la métrique utilisée : RIP ne cherche pas le débit maximal, mais le plus petit nombre de routeurs traversés ; OSPF additionne les coûts.

Base de donnéesClés étrangères, requêtes SELECT, INSERT, UPDATE, SUM et JOIN.
ObjetAttributs, méthodes, réservation, libération de salle et séminaire.
RéseauxAdresse IP, sous-réseau /24, table de routage, RIP, OSPF.
AlgorithmiqueDictionnaires, récursivité, calcul redondant, programmation dynamique.

Méthode pour utiliser ce corrigé NSI

D’abord, essaie de répondre seul à une question avant de lire la solution. Ensuite, compare ton raisonnement avec celui proposé : les points se gagnent souvent grâce à la justification, pas seulement grâce au résultat. De plus, recopie les requêtes SQL et les fonctions Python dans un éditeur pour vérifier leur logique. Enfin, pour les questions de réseau, refais les chemins sur un brouillon : c’est le moyen le plus sûr d’éviter la confusion entre RIP et OSPF.

Conseil de copie : lorsqu’un code est demandé, préfère une réponse courte, claire et directement exécutable. Lorsqu’une explication est demandée, écris une phrase qui relie le résultat au contexte du sujet.

Corrigé NSI Antilles 2026 — exercice 1 : SQL et programmation objet

L’exercice 1 porte sur une agence de coworking. La première partie exploite les tables salle, reservation et client. La seconde partie traduit une partie de cette logique en programmation orientée objet.

1. Clés étrangères de la relation reservation

La relation reservation contient deux attributs qui renvoient vers d’autres tables :

  • id_client référence la clé primaire client(id_client) ;
  • id_salle référence la clé primaire salle(id_salle).
Réponse : les clés étrangères sont donc id_client et id_salle. L’attribut id est, lui, la clé primaire de reservation.

2. Résultat de la requête SELECT

La requête garde les salles dont le nombre de places est strictement supérieur à 5, puis trie les résultats par tarif croissant. Les salles concernées sont RB, RA et Ravel.

intituletarif_jour
RB300
RA350
Ravel2300

3. Liste sans doublon des salles réservées depuis janvier 2024

SELECT DISTINCT id_salle
FROM reservation
WHERE date > '2024-01-01';

Le mot-clé DISTINCT est indispensable : une même salle peut apparaître plusieurs fois dans la table des réservations.

4. Ajout du client EN et de sa réservation

INSERT INTO client (id_client, societe, num_tel)
VALUES (3, 'EN', '0144624055');

INSERT INTO reservation (id, id_client, id_salle, date, duree)
VALUES (5, 3, 4, '2024-06-12', 1);

On ajoute d’abord le client, car la réservation contient une clé étrangère id_client. Ensuite seulement, on ajoute la réservation liée à ce client.

5. Mise à jour de la capacité de la salle Ravel

UPDATE salle
SET nb_places = 95
WHERE id_salle = 2;

Utiliser l’identifiant de la salle est plus robuste que se fonder sur la casse du nom Ravel ou RAVEL.

6. Temps total de réservation de la salle 6

SELECT SUM(duree) AS temps_total
FROM reservation
WHERE id_salle = 6;

La fonction d’agrégation SUM additionne toutes les durées des réservations de la salle d’identifiant 6.

7. Sociétés ayant réservé une salle de réunion

SELECT DISTINCT client.societe
FROM client
JOIN reservation ON client.id_client = reservation.id_client
JOIN salle ON reservation.id_salle = salle.id_salle
WHERE salle.type = 'Réunion';

Deux jointures sont nécessaires : la table reservation relie les clients aux salles, puis la table salle permet de filtrer le type ‘Réunion’.

8. Exemple d’attribut et de méthode

Un attribut possible est self.intitule, self.nb_places, self.dispo ou self.occupant. Une méthode possible est reserver.

Réponse possible : attribut : dispo ; méthode : reserver.

9. Méthode liberer

def liberer(self):
    self.dispo = True
    self.occupant = ""

La salle redevient disponible et l’occupant est remis à la chaîne vide, conformément à l’énoncé.

10. Fonction salles_dispos

def salles_dispos(liste_salles):
    res = []
    for salle in liste_salles:
        if salle.dispo:
            res.append(salle.intitule)
    return res

Dans le code fourni, S1 et S2 ont déjà été réservées. La fonction renverrait donc les intitulés des salles encore disponibles : [‘RA’, ‘B2’, ‘RB’].

11. Méthode ajouter_reservation

def ajouter_reservation(self, salle):
    if salle.dispo:
        self.liste_salles.append(salle)
        self.prix_total = self.prix_total + salle.reserver(self.client)
        return True
    return False

La méthode vérifie d’abord la disponibilité. Ensuite, elle ajoute la salle dans la liste du séminaire et augmente le prix total avec le tarif renvoyé par salle.reserver(self.client). Si la salle est déjà prise, rien ne change et la méthode renvoie False.

Exercice 2 corrigé : routage, RIP, OSPF et graphes

L’exercice 2 demande de bien distinguer les adresses IP, les sous-réseaux, la métrique RIP et la métrique OSPF. Ensuite, il transpose ces idées à un réseau routier représenté par un graphe.

1. Pourquoi R2 ne peut pas avoir l’adresse 192.168.2.3 sur le lien avec R1

Le lien entre R1 et R2 appartient au sous-réseau 192.168.1.0/24. Avec un suffixe /24, les trois premiers octets identifient le réseau. Une adresse de ce sous-réseau doit donc commencer par 192.168.1.

Conclusion : 192.168.2.3 appartient au sous-réseau 192.168.2.0/24, pas au sous-réseau 192.168.1.0/24. Elle ne convient donc pas pour R2 sur le lien avec R1.

2. Table de routage possible de R4 avec RIP

RIP minimise le nombre de routeurs à traverser. En cas d’égalité, plusieurs passerelles peuvent être acceptées. Voici une table cohérente.

DestinationPasserelleDistance
10.1.6.0/24connecté0
10.2.6.0/24connecté0
192.168.2.0/24connecté0
10.1.1.0/2410.1.6.11
192.168.1.0/2410.1.6.1 ou 192.168.2.12
192.168.4.0/24192.168.2.11
10.2.7.0/2410.2.6.2 ou 192.168.2.11

3. Débit entre R1 et R2

Le coût est inversement proportionnel au débit. Le lien R3-R4 a un coût de 1 et un débit de 10 Gbit/s. Le lien R1-R2 a un coût de 20.

Donc son débit vaut : 10 / 20 = 0,5 Gbit/s.

Réponse : le débit entre R1 et R2 est de 0,5 Gbit/s, soit 500 Mbit/s.

4. Chemin de R1 vers R5 avec RIP

RIP minimise le nombre de routeurs traversés. Le plus court chemin en nombre de liaisons est :

R1 → R2 → R6 → R5

Ce chemin traverse moins de routeurs que le chemin R1 → R2 → R3 → R4 → R5.

5. Chemin avec RIP si la liaison R2-R6 tombe en panne

Si la liaison R2-R6 n’existe plus, le chemin précédent est impossible. Le meilleur chemin RIP restant est :

R1 → R2 → R3 → R4 → R5

6. Chemin avec OSPF et comparaison avec RIP

OSPF minimise la somme des coûts. Comparons les deux chemins principaux :

  • R1 → R2 → R6 → R5 : coût 20 + 100 + 200 = 320 ;
  • R1 → R2 → R3 → R4 → R5 : coût 20 + 50 + 1 + 20 = 91.
Réponse : avec OSPF, le chemin est R1 → R2 → R3 → R4 → R5. Il est différent du chemin choisi par RIP lorsque la liaison R2-R6 fonctionne, car RIP choisit le chemin avec le moins de sauts, tandis qu’OSPF choisit le plus faible coût total.

7. Graphe du réseau mis à jour

Deux routeurs sont reliés lorsqu’ils possèdent une adresse dans le même sous-réseau /24. Une représentation possible du graphe mis à jour est donc donnée par les arêtes suivantes :

Sous-réseauArête
192.168.1.0R1 — R2
114.156.4.0R1 — R7
178.115.8.0R1 — R8
10.1.1.0R2 — R3
192.168.4.0R2 — R6
10.1.6.0R3 — R4
192.162.2.0R3 — R7
10.2.6.0R4 — R5
192.168.2.0R4 — R6
10.2.7.0R5 — R6
12.14.8.0R5 — R7
10.7.2.0R6 — R8

8. Itinéraires GPS, RIP et OSPF

L’itinéraire A minimise le temps de parcours : il correspond à OSPF, car OSPF minimise une somme de coûts. L’itinéraire B minimise le nombre de villes traversées : il correspond à RIP, car RIP minimise le nombre de sauts.

Réponse : itinéraire A = OSPF ; itinéraire B = RIP.

9. Parcours en largeur depuis V3

En suivant l’ordre des listes d’adjacence donné dans le dictionnaire, le parcours en largeur depuis ‘V3’ visite les sommets couche par couche.

Réponse : [‘V3’, ‘V2’, ‘V4’, ‘V1’, ‘V6’, ‘V5’].

10. Évolution de la variable precedent

En suivant exactement le programme, l’évolution complète à la fin de chaque passage utile dans la boucle est :

ÉtapeContenu de precedent
Départ{‘V1’: None}
Après V1{‘V1’: None, ‘V2’: ‘V1’}
Après V2{‘V1’: None, ‘V2’: ‘V1’, ‘V3’: ‘V2’, ‘V6’: ‘V2’}
Après V3{‘V1’: None, ‘V2’: ‘V1’, ‘V3’: ‘V2’, ‘V6’: ‘V2’, ‘V4’: ‘V3’}
Après V6 et arrêt{‘V1’: None, ‘V2’: ‘V1’, ‘V3’: ‘V2’, ‘V6’: ‘V2’, ‘V4’: ‘V6’, ‘V5’: ‘V6’}

Attention : le programme ne teste pas si un voisin est déjà présent dans precedent. La valeur associée à ‘V4’ peut donc être remplacée par ‘V6’.

11. Valeur renvoyée par itineraire_court(route, ‘V1’, ‘V5’)

On reconstruit le chemin à rebours : V5 vient de V6, V6 vient de V2, V2 vient de V1. Après inversion, on obtient :

Réponse : [‘V1’, ‘V2’, ‘V6’, ‘V5’].

Exercice 3 corrigé : dictionnaires, récursivité et programmation dynamique

L’exercice 3 modélise un stock de planches avec un dictionnaire. Ensuite, il montre pourquoi une solution récursive naïve peut recalculer plusieurs fois les mêmes valeurs, puis comment la programmation dynamique permet de mémoriser les résultats déjà obtenus.

1. Initialiser le dictionnaire effectif

effectif = {1: 3, 2: 4, 4: 1}

La clé est la longueur de la planche, et la valeur est l’effectif correspondant.

2. Valeur totale des planches de 10 m

Expression : effectif[10] * prix[10].

Comme l’énoncé précise qu’il existe au moins une planche de 10 m, on peut utiliser directement la clé 10.

3. Tester la présence de planches de 5 m

Expression : 5 in effectif.

Dans un dictionnaire Python, l’opérateur in teste la présence d’une clé.

4. Fonction valeur_stock

def valeur_stock(effectif):
    valeur_totale = 0
    for longueur in effectif:
        valeur_totale = valeur_totale + effectif[longueur] * prix[longueur]
    return valeur_totale

On parcourt les longueurs présentes dans le dictionnaire. Pour chaque longueur, on multiplie l’effectif par le prix unitaire de cette longueur.

5. Fonction mise_a_jour

def mise_a_jour(effectif, autre_effectif):
    for longueur in autre_effectif:
        if longueur in effectif:
            effectif[longueur] = effectif[longueur] + autre_effectif[longueur]
        else:
            effectif[longueur] = autre_effectif[longueur]

La fonction modifie directement le dictionnaire effectif. Si la longueur existe déjà, on ajoute l’effectif apporté par le camion. Sinon, on crée une nouvelle entrée.

6. Fonction vendre

def vendre(effectif, longueur):
    effectif[longueur] = effectif[longueur] - 1
    if effectif[longueur] == 0:
        del effectif[longueur]

Après la vente, l’effectif diminue de 1. Si l’effectif devient nul, il faut supprimer la clé, car l’énoncé précise qu’une longueur absente du stock ne doit pas apparaître dans le dictionnaire.

7. Valeur maximale d’une planche de 4 m

On compare toutes les possibilités pertinentes :

  • vendre la planche entière : 9 € ;
  • découper en 3 m + 1 m : 8 + 1 = 9 € ;
  • découper en 2 m + 2 m : 5 + 5 = 10 € ;
  • découper en quatre planches de 1 m : 4 €.
Réponse : la valeur maximale est 10 €, obtenue avec deux planches de 2 m.

8. Cas d’arrêt de la formule récursive

Le cas d’arrêt est n ≤ 3. Pour les longueurs 1, 2 et 3, on connaît directement la meilleure valeur : prix[n]. La fonction n’a donc pas besoin de s’appeler elle-même.

9. Calculs de valmax(1), valmax(2), valmax(3), valmax(4)

  • valmax(1) = prix[1] = 1 ;
  • valmax(2) = prix[2] = 5 ;
  • valmax(3) = prix[3] = 8 ;
  • valmax(4) = max(prix[4], prix[3]+valmax(1), prix[2]+valmax(2), prix[1]+valmax(3)) = max(9, 9, 10, 9) = 10.

10. Justification de la formule pour n ≥ 4

Pour une planche de longueur n, deux stratégies existent. Soit on la vend entière pour prix[n], soit on fait une première découpe : une partie est vendue directement, et le reste est optimisé grâce à valmax. La formule teste toutes les premières découpes possibles et conserve le maximum.

11. Fonction valmax récursive

def valmax(n):
    if n <= 3:
        return prix[n]
    else:
        maximum = prix[n]
        for longueur in range(1, n):
            maximum = max(maximum, prix[n-longueur] + valmax(longueur))
        return maximum

La boucle teste toutes les premières découpes possibles. La partie de longueur n-longueur est vendue directement, tandis que la partie de longueur longueur est optimisée récursivement.

12. Pourquoi valmax(7) appelle deux fois valmax(5)

Lors de l’appel valmax(7), la boucle appelle directement valmax(5) pour l’une des découpes. Elle appelle aussi valmax(6), et le calcul de valmax(6) appelle à son tour valmax(5). Sans mémoïsation, le même calcul est donc répété.

13. Fonction valmax_dynamique

def valmax_dynamique(n):
    if memo[n] != -1:
        return memo[n]
    else:
        maximum = prix[n]
        for longueur in range(1, n):
            maximum = max(maximum, prix[n-longueur] + valmax_dynamique(longueur))
        memo[n] = maximum
    return maximum

Si memo[n] est différent de -1, la valeur a déjà été calculée. Sinon, on la calcule, puis on la mémorise dans memo[n].

14. Nombre d’appels récursifs pour valmax_dynamique(6) après valmax_dynamique(5)

Après l’exécution de valmax_dynamique(5), les valeurs utiles jusqu’à 5 sont déjà mémorisées. L’appel valmax_dynamique(6) effectue alors 5 appels récursifs directs : pour les longueurs 1, 2, 3, 4 et 5. Mais ces appels renvoient immédiatement leur valeur mémorisée.

Réponse : il y a 5 appels récursifs directs, et aucun calcul récursif profond supplémentaire.

15. Initialiser memo uniquement avec des -1

Les valeurs de base memo[1], memo[2] et memo[3] ne seraient plus disponibles immédiatement. Avec le code proposé, le programme pourrait tout de même les calculer lors des premiers appels, mais il perdrait l’intérêt de les avoir déjà mémorisées. Il ferait donc des calculs inutiles au début.

Remarque pédagogique : dans beaucoup de versions de cet algorithme, les cas de base sont indispensables pour arrêter clairement la récursion. Ici, la boucle vide pour n = 1 évite l’erreur, mais l’initialisation fournie reste la meilleure pratique.

16. Fonction valeur_max_stock

def valeur_max_stock(effectif):
    total = 0
    for longueur in effectif:
        total = total + effectif[longueur] * valmax_dynamique(longueur)
    return total

On multiplie, pour chaque longueur présente dans le stock, le nombre de planches par la valeur maximale obtenue après optimisation de la découpe.

Erreurs fréquentes à éviter dans ce corrigé NSI

SQLOublier DISTINCT lorsque l’on demande une liste sans doublon.
JointuresRelier directement client et salle sans passer par reservation.
ObjetConfondre attribut et méthode : dispo est un attribut ; reserver est une méthode.
RIP / OSPFChoisir le chemin le plus rapide pour RIP : c’est faux, RIP minimise le nombre de sauts.
GraphesOublier l’ordre des listes d’adjacence dans le parcours en largeur.
Programmation dynamiqueCalculer memo[n] mais oublier de l’enregistrer avant de renvoyer le résultat.

Compléter ses révisions en NSI

Pour prolonger ce corrigé NSI Antilles 2026, il est utile de refaire les requêtes SQL à la main, puis de tester les fonctions Python avec de petits exemples. Les notions de graphes et de programmation dynamique gagnent aussi à être révisées par schéma : un dessin du graphe, une table de mémorisation et quelques appels récursifs suffisent souvent à clarifier la méthode.

Tous les sujets NSI Accueil Fiches NSI — prochainement Lexique NSI — prochainement

Ressources officielles et utiles

Télécharger le sujet officiel de NSI

Le sujet officiel du bac NSI Antilles-Guyane 2026 jour 2 est accessible ci-dessous. Le corrigé détaillé est intégré directement dans cette page.

DocumentAccès
Sujet officiel NSI Antilles-Guyane 2026 jour 2 SUJET PDF
Corrigé complet CORRIGÉ DANS LA PAGE

FAQ — Corrigé NSI Antilles 2026 jour 2

Le corrigé traite-t-il tout le sujet ?

Oui. Les 3 exercices et les 38 questions sont corrigés : SQL, programmation objet, routage, graphes, dictionnaires, récursivité et programmation dynamique.

Quelle est la difficulté principale de l’exercice 1 ?

La principale difficulté est de bien utiliser les clés étrangères et les jointures. La table reservation sert de lien entre client et salle.

Quelle est la différence entre RIP et OSPF ?

RIP choisit le chemin avec le plus petit nombre de routeurs traversés. OSPF choisit le chemin dont la somme des coûts est minimale.

Pourquoi la fonction itineraire_court renvoie-t-elle V1, V2, V6, V5 ?

Le parcours en largeur trouve un plus court chemin en nombre d’arêtes. Dans le graphe donné, V1 → V2 → V6 → V5 atteint V5 en trois arêtes.

À quoi sert memo dans l’exercice 3 ?

La liste memo mémorise les valeurs maximales déjà calculées afin d’éviter les appels récursifs redondants.

Où trouver les autres annales NSI ?

Le lien “Tous les sujets NSI” mène à la page de regroupement des annales et corrigés NSI du bac.