Adloun

Corrigé bac NSI 2026 Métropole jour 1 — Exercice 3 : Plateforme de débats : arbre des arguments en POO et base de données SQL

Sujet officiel du baccalauréat, spécialité numérique et sciences informatiques, session 2026. Corrigé rédigé par Ibrahim Alame.

Sujet officiel (PDF)

Énoncé

Cet exercice porte sur les arbres, l'algorithmique des arbres, et les bases de données.

On s'intéresse au fonctionnement interne d'une plateforme en ligne dédiée spécifiquement aux débats. Plutôt que de lister des messages des utilisateurs dans l'ordre chronologique, les différentes contributions sont structurées de façon arborescente afin de mieux comprendre les liens entre les arguments. Chaque contribution vient se rattacher à une affirmation, soit afin d'appuyer cette affirmation avec un argument pour, soit afin de l'attaquer avec un argument contre.

Cet exercice contient deux parties indépendantes l'une de l'autre.

Partie A : structure arborescente des arguments

Dans cette partie on modélise un arbre de débat pour un sujet de débat. La figure 1 montre un exemple d'arbre de débat.

Figure 1. Arbre de débat sur l'objectivité de la science

Dans un arbre de débat, chaque nœud est une affirmation, et il y en a de trois sortes :

De plus, chaque affirmation peut être likée (j'aime) ou dislikée (je n'aime pas) par les utilisateurs.

1. Indiquer le nom donné au nœud « point de départ du débat » dans le vocabulaire des arbres.

2. Indiquer en justifiant si un arbre de débat est un arbre binaire ou non.

On modélise la structure d'arbre de débat à l'aide de la classe suivante :


class Affirmation:
    def __init__(self, phrase):
        """
        Création d'un objet Affirmation à partir d'une
        phrase (str).
        """
        self.contenu = phrase
        self.sorte = "" # vaudra "sujet", "pour" ou "contre"
                        # vaut "" avant ajout dans l'arbre
        self.arguments = []
        self.nb_likes = 0
        self.nb_dislikes = 0

3. Donner le nom et le type de chaque attribut de la classe Affirmation.

On souhaite ajouter à cette classe une méthode soutenir qui permet d'ajouter un argument pour à l'affirmation.

On suppose à disposition une méthode contrer similaire qui permet d'ajouter un argument contre à l'affirmation.


def soutenir(self, argument):
    """
    Ajoute l'Affirmation `argument` comme argument pour de
    l'Affirmation `self`.

    Précondition : l'Affirmation ne doit pas avoir déjà été
    utilisée, ni comme sujet, ni comme pour, ni comme
    contre, ce qu'on vérifie grâce à son attribut `sorte`.
    """
    assert argument.sorte == ...
    ... .append(argument)
    argument.sorte = "..."

4. Recopier et compléter les lignes 10 à 12 de la méthode soutenir, en respectant sa documentation.

Pour mesurer les débats les plus vifs, la plateforme de débats dispose de plusieurs mesures.

5. Écrire la méthode nb_contre qui permet d'obtenir le nombre d'arguments contre directement rattachés à cette Affirmation.

On s'intéresse à la méthode mystere suivante, qui utilise la méthode nb_contre :


def mystere(self):
    m = self.nb_contre()
    for arg in self.arguments:
        candidat = arg.mystere()
        if candidat > m:
            m = candidat
    return m

6. Expliquer par une phrase ce que renvoie la méthode mystere.

Afin de trancher le débat dans sa globalité, on souhaite évaluer une Affirmation, en tenant compte de la totalité des likes et des dislikes de chaque argument, et en tenant compte du fait que ces arguments soient pour ou contre. Si l'évaluation est positive le pour l'emporte, si elle est négative le contre l'emporte.

La formule pour l'évaluation d'une affirmation correspond à la somme de ses likes et des évaluations de ses arguments pour, à laquelle on soustrait ses dislikes et les évaluations de ses arguments contre.

7. Écrire, en utilisant uniquement des lignes de code choisies parmi les lignes suivantes, une méthode evaluation qui renvoie le résultat du calcul décrit dans la formule ci-dessus. Les lignes ne sont pas toutes à utiliser et l'indentation est à adapter.


def evaluation(self):
def evaluation():
total = self.nb_likes + self.nb_dislikes
total = self.nb_likes - self.nb_dislikes
total = self.nb_dislikes - self.nb_likes
total = self.nb_likes * self.nb_dislikes
for arg in self.arguments:
for arg in self.arguments_pour:
for arg in self.arguments_contre:
if arg.sorte == "sujet":
if arg.sorte == "pour":
if arg.sorte == "contre":
else:
total = arg.evaluation()
total = total + arg.evaluation()
total = total - arg.evaluation()
total = total * arg.evaluation()
return total
return 1 + total
Partie B : base de données des utilisateurs et de leurs contributions

Dans cette partie, on pourra utiliser les clauses du langage SQL pour :

Pour manipuler toutes les informations sur plusieurs sujets de débats, la plateforme dispose d'un Système de Gestion de Bases de Données (SGBD).

8. Parmi les propositions suivantes, indiquer celles qui font partie des rôles d'un SGBD :

Pour gérer les données, le schéma relationnel utilisé est représenté sur la figure 2 (transcrit ici en notation textuelle : clés primaires soulignées, clés étrangères précédées d'un « # ») :

utilisateur(pseudo, email, nom, prenom)

affirmation(id_aff, contenu, #auteur, sorte, #aff_repondue, nb_likes, nb_dislikes)

reaction(#aff_reagie, #utilisateur, sorte)

Flèches du schéma : affirmation.auteur et reaction.utilisateur référencent utilisateur.pseudo ; affirmation.aff_repondue et reaction.aff_reagie référencent affirmation.id_aff.

Figure 2. Schéma relationnel de la plateforme de débat

La clé primaire de chaque table correspond à l'ensemble de ses attributs soulignés. Chaque attribut précédé d'un « # » est une clé étrangère.

L'attribut sorte de la table affirmation peut valoir 'sujet' quand c'est l'affirmation initiale d'un sujet de débat, ou bien 'pour' ou 'contre' quand c'est une réponse à une autre affirmation (référencée par l'attribut aff_repondue). L'attribut contenu correspond à la phrase elle-même de l'affirmation.

L'attribut sorte de la table reaction peut valoir 'like' ou 'dislike', et s'applique à l'affirmation référencée par l'attribut aff_reagie.

Voici des exemples d'extraits des tables affirmation et reaction. On a omis, pour ces exemples, les attributs auteur et contenu de la table affirmation :

affirmation
id_affsorteaff_reponduenb_likesnb_dislikes
0'sujet'NULL4217
1'pour'02020
2'pour'04010
3'contre'01312
4'contre'0186
7'contre'11516
reaction
aff_reagieutilisateursorte
0'alice''like'
1'alice''dislike'
0'bob''dislike'
1'bob''dislike'

9. Indiquer en justifiant quel autre attribut de la table utilisateur aurait aussi pu servir de clé primaire.

On rappelle que la fonction d'agrégation COUNT permet de compter les éléments du résultat d'une requête en plaçant COUNT(*) dans la clause SELECT.

10. Écrire une requête SQL permettant d'obtenir le nombre d'affirmations qui ont 50 likes ou plus.

11. Écrire une requête qui permet d'obtenir les contenus des sujets et leur nombre de likes, créés par les utilisateurs dont les prénom et nom sont respectivement 'Pierre' et 'Durand'.

Le mot-clé AS permet de donner un autre nom à une table au sein d'une requête. Il est notamment nécessaire lorsqu'on a besoin de faire la jointure d'une table avec elle-même. On considère la requête SQL suivante :


SELECT aff.contenu, rep.contenu
FROM affirmation AS aff JOIN affirmation AS rep
  ON rep.affirmation_repondue = aff.id_affirmation
WHERE rep.nb_likes >= 2 * aff.nb_likes
  AND rep.sorte = 'contre'

12. Donner une interprétation en français de ce que permet d'obtenir la requête ci-dessus.

L'utilisateur au pseudo 'i<3descartes' approuve par un like l'affirmation 'Cogito ergo sum' qui a l'id_aff 108.

13. Recopier et compléter les deux requêtes SQL suivantes, permettant de mettre à jour les informations de la base de données suite à cette action.


... reaction
VALUES (..., ..., ...);;

... affirmation
SET nb_likes = ...
WHERE ... = ...;;

L'utilisateur au pseudo 'i<3rgpd' souhaite faire valoir son droit à l'effacement, et supprimer son compte utilisateur et toutes les données qui y sont liées. Dans cette situation, la plateforme de débat, qui souhaite maintenir la qualité des échanges, suit la procédure suivante :

14. Expliquer pourquoi il est nécessaire de supprimer les réactions de l'utilisateur avant de supprimer l'utilisateur.

15. Écrire les trois requêtes qui permettent la suppression des données du compte de 'i<3rgpd' en suivant la procédure décrite ci-dessus.

Corrigé

Partie A : structure arborescente des arguments

1. Le point de départ du débat est la racine de l'arbre : l'unique nœud sans parent, dont tous les autres nœuds descendent. Sur la figure 1, c'est le parallélogramme « La Science est une activité humaine objective. » ; les arguments sans réponse (par exemple « Les géants pétroliers… ») en sont les feuilles.

2. Un arbre binaire est un arbre dont chaque nœud possède au plus deux enfants (un sous-arbre gauche et un sous-arbre droit). Ce n'est pas le cas d'un arbre de débat : une affirmation peut recevoir autant d'arguments qu'on veut. Sur la figure 1, la racine a quatre enfants (deux arguments pour et deux arguments contre) et l'affirmation « La recherche financée par des organismes commerciaux peut tordre les faits. » en a trois. Un arbre de débat est donc un arbre général (dit « quelconque »), et non un arbre binaire. Dans la classe Affirmation, cela se traduit par l'attribut arguments, une liste d'enfants de longueur quelconque, là où un arbre binaire aurait deux attributs gauche et droit.

3. Les attributs sont ceux créés dans le constructeur __init__ :

AttributTypeRôle
contenustrla phrase de l'affirmation
sortestr"", puis "sujet", "pour" ou "contre"
argumentslist (d'objets Affirmation)les arguments rattachés, vide au départ
nb_likesintnombre de likes, 0 au départ
nb_dislikesintnombre de dislikes, 0 au départ

100 % gratuit

La suite du corrigé est sur Adloun

Le corrigé rédigé en entier, partie par partie, et le tuteur pour poser des questions sur ce sujet.

Voir le corrigé complet, gratuitement

Inscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.

Corrigé complet gratuit →