Sujet bac NSI 2025 jour 1 (17 juin) | Correction

Exercice 1⚓

Partie A

  1. Expliquer pourquoi l'attrlbut num_ser ne peut pas etre une clé primaire de la relatlon inventaire.

    Une clĂ© primaire doit respecter une contrainte d'unicitĂ©, num_ser est unique au sein d'une mĂȘme marque (deux guitares de la marque \(Fender\) ne pourront pas avoir le mĂȘme numĂ©ro de sĂ©rie), mais cet attribut n'est pas unique pour l'ensemble des guitares (on ne peut pas garantir que deux guitares de marques diffĂ©rentes n'ont pas le mĂȘme numĂ©ro de sĂ©rie). Pour cette raison, num_ser ne peut pas ĂȘtre une clĂ© primaire de la relation inventaire.

  2. Donner sous forme de tableau le rĂ©sultat‘de la requĂȘte suivante appliquĂ©e Ă  l'extrait de table prĂ©cĂ©dente

    SQL
    1
    2
    3
    SELECT marque, modele
    FROM inventaire
    WHERE annee = 1956
    
    Voici le rĂ©sultat de la requĂȘte:

    marque modele
    Gibson Les Paul Goldtop
    Fender Stratocaster
  3. Écrire une requĂȘte SQL permettant d’obtenir toutes les annĂ©es du modĂšle Les Paul Standard dans la collection.

    La clause DISTINCT permet d'Ă©viter les rĂ©pĂ©titions des annĂ©es de plusieurs exemplaires d'un mĂȘme modĂšle de guitare, mĂȘme si ce n'est pas le cas dans cet extrait.

    SQL
    1
    2
    3
    SELECT DISTINCT annee
    FROM inventaire
    WHERE modele = 'Les Paul Standard'
    
  4. Écrire une requĂ©te SQL permettant d’obtenir tous les modĂšles de guitares de la marque Gibson par ordre croissant de l'annĂ©e dans la collection.

    SQL
    1
    2
    3
    4
    SELECT modele
    FROM inventaire
    WHERE marque = 'Gibson'
    ORDER BY annee
    

    On utilise pas DISTINCT ici car on veut différencier les modÚles produits a des années différentes. La clause SELECT serait plus explicite avec SELECT modele, annee mais ce n'est pas indiqué dans la question.

  5. Maud a fait une erreur de saisie pour la guitare d'identifiant id=1. L'annĂ©e est en realitĂ© 1957. Ecrire une requĂȘte SQL permettant de corrrger cette erreur de saisie.

    SQL
    1
    2
    3
    UPDATE inventaire
    SET annee = 1957
    WHERE id = 1
    

    Partie B

    La transformation de la relation inventaire en 3 relations marque, modele et guitare est utile pour éviter les redondances.

    Cependant le systÚme clé primaire, clé étrangÚre demande de respecter les contraintes d'intégrité.

  6. Expliquer briĂ©vement, en justifiant, dans quel ordre les trois tables doiventĂȘtre créées.

    Pour respecter la contrainte de référencement, on crée les tables dans l'ordre suivant : - marque qui ne contient aucune clé étrangÚre. - modele, dont la clé étrangÚre id_marque référence la clé primaire de marque - guitare dont la clé étrangÚre id_modele correspond à la clé primaire de modele

  7. Écrire une requĂȘte SQL permettant d’obtenir le numĂ©ro de sĂ©rie et l’annĂ©e de toutes les guitares Les Paul Standard de la collection.

    SQL
    1
    2
    3
    4
    SELECT guitare.num_ser, guitare.annee
    FROM guitare
    JOIN modele ON guitare.id_modele = modele.id
    WHERE nom = 'Les Paul Standard'
    
  8. Ecrire une requĂȘte SQL permettant de retirer de la collection la guitare d’identifiant id=3.

    SQL
    DELETE FROM guitare
    WHERE id = 3
    
  9. Écrire l’ensemble des requĂȘtes SQL permettant d’ajouter la guitare suivante :

    • marque : BC Rich
    • modĂšle : Mockingbird
    • annĂ©e : 1992
    • numĂ©ro de sĂ©rie : 92R
    • prix : 5000.

    Comme indiquĂ© Ă  la question 6., on va Ă©crire 3 requĂȘtes a effectuer impĂ©rativement dans l'ordre suivant pour respecter les contraintes de rĂ©fĂ©rence.

    SQL
    INSERT INTO marque (id, nom)
    VALUES (3, 'BC Rich')
    
    SQL
    INSERT INTO modele (id, nom, id_marque)
    VALUES (5, 'Mockingbird', 3)
    
    SQL
    INSERT INTO guitare (id, id_modele, annee, num_ser, prix)
    VALUES (9, 5, 1992, '92R', 5000)
    
  10. Écrire une requĂȘte SQL permettant de calculer la valeur totale des modĂ©les Stratocaster de la collection de Slash.

    SQL
    1
    2
    3
    4
    SELECT SUM(prix)
    FROM guitare
    JOIN modele on guitare.id_modele = modele.id
    WHERE nom = 'Stratocaster'
    

Exercice 2⚓

  1. Donner |e code Python qui permet d’instancier deux variables tache1 et tache2 reprĂ©sentant les tĂąches :

    • tĂąche numĂ©ro 1 : RĂ©pondre aux e-mails. DurĂ©e estimĂ©e : 45 minutes.

    • tĂąche numĂ©ro 2 : Ranger ma chambre. DurĂ©e estimĂ©e : 6O minutes.

    Instancier, c'est créer un nouvel objet de la classe. Cela correspond à un appel de la méthode __init__ (constructeur) avec le nom de la classe et en précisant les paramÚtres.

    tache1 = Tache(1, "Répondre aux e-mails", 45)

    tache2 = Tache(2, "Ranger ma chambre", 60)

  2. Recopier et complĂ©ter ie code de la mĂ©thode avancer de la classe Tache qui permet d’avancer la tĂąche self de n minutes.

    Python
    def avancer(self, n: int) -> None:
        self.duree restante -= n # décrémentation de n minutes
    
  3. Recopier et compléter le code de la méthode est_terminee de la classe Tache qui renvoie True si la tache est terminée, ou False sinon.

    Python
    def est_terminee(self) -> bool:
        return self.duree restante <= 0
    
  4. ReprĂ©senter l’état de la file f lorsqu’on lui ajoute successivement la tĂąche numĂ©ro 6 avec la prioritĂ© 2, puis la tache numĂ©ro 7 avec la prioritĂ© 4 en respectant les conditions 1 et 2 dĂ©crites ci-dessus.

    [début] (<t3>, 4) (<t7>, 4) (<t1>, 3) (<t2>, 3) (<t6>, 2) (<t4>, 1) (<t5>, 1) [fin]

  5. En repartant de la file f suivante :

    [début] (<t3>,4) (<t1>,3) (<t2>,3) (<t4>,1) (<t5>,1) [fin]

    donner la valeur de f.defiler()[0], et reprĂ©senter le contenu de la file f aprĂšs l’exĂ©cution de cette instruction.

    f.defiler()[0] retourne le premier tuple de la file, [0] retourne le premier élément de ce tuple.

    Avec la file f la valeur est donc : <t3>.

    AprĂšs cette instruction, la file sera alors :

    [début] (<t1>,3) (<t2>,3) (<t4>,1) (<t5>,1) [fin]

  6. En repartant de la file f suivante :

    [début] (<t3>, 4) (<t1>, 3) (<t2>, 3) (<t4>, 1) (<t5>, 1) [fin]

    donner la valeur de f.examiner()[1], et reprĂ©senter le contenu de la file f aprĂšs l’exĂ©cution de cette instruction.

    f.examiner() renvoie le premier élément de la file : (\<t3\>, 4)

    f.examiner()[1] vaut le deuxiÚme élément de ce tuple : 4

    la file n'est pas modifiée par la méthode examiner, elle vaut donc toujours :

    [début] (<t3>, 4) (<t1>, 3) (<t2>, 3) (<t4>, 1) (<t5>, 1) [fin]

  7. Recopier et compléter le code de la fonction ajouter_fi1e_prio.

    Python
    def ajouter_file_prio(f, t, p):
        f_aux = File()
    
        # Transfert des éléments de priorité supérieures ou égales à p dans f_aux
        while not f.est_vide() and f.examiner()[1] >= p:
            f_aux.enfiler(f.defiler())
    
        # Ajout du nouvel élément (t, p) à la bonne position
        f_aux.enfiler((t, p))
    
        # Transfert le reste de f dans f_aux
        while not f.est_vide():
            f_aux.enfiler(f.defiler())
    
        # Transfert des éléments la file f_aux dans f
        while not f_aux.est_vide():
            f.enfiler(f_aux.defiler())
    
  8. Donner le coĂ»t d’exĂ©cution temporel dens le pire des cas de la fonction ajouter_fi1e_prio, en fonction du nombre m d’élĂ©ments de la file f.

    La fonction ajouter_fi1e_prio est composée de plusieurs parties :

    • crĂ©ation en la file f_aux : \(O(1)\)
    • premiĂšre et deuxiĂšme boucle while : transfert des m Ă©lĂ©ments de f vers f_aux: \(O(m)\)
    • ajout du nouvel Ă©lĂ©ment (f_aux.enfiler((t, p))) : \(O(1)\)
    • transfert des Ă©lĂ©ments de f_aux vers f : \(O(m)\)

    Au total la complexité temporelle dans le pire des cas est donc linéaire en la taille de la file : \(O(m)\).

  9. Indiquer pour chaque bloc de 25 minutes la tĂąche qui avance, en suivant le modĂšle proposĂ©, jusqu’a la fin de toutes les tĂąches.

    la condition 2 indique qu'une tĂąche non terminĂ©e se rĂ© insĂ©rĂ©e aprĂšs les autres tĂąches de mĂȘme prioritĂ©, il va donc y avoir un alternance de type tourniquet entre les tĂąches de mĂȘme prioritĂ© ayant une durĂ©e restante supĂ©rieure Ă  25 minutes.

    numéro bloc 25 minutes 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    numéro de tùche avancée 3 7 3 3 3 1 2 1 2 2 6 6 6 4 5 4 5
  10. Écrire Le code d’une fonction planning qui prend en paramÈtre une file de prioritĂ© f dont Ies Ă©lĂ©ments sont des tuples (tache, prio), et qui renvoie une liste de tĂąches, dans l’ordre dans lequel elles vont ĂȘtre effectuĂ©es par tranche de 25 minutes avec la mĂ©thode Pomodoro.

    Python
    def planning(f):
        execution = [] # liste qui contiendra les tùches à exécuter
    
        while not f.est_vide():
    
                tache, prio = f.defiler() # récupÚre la tùche de début de file
                execution.append(tache) # ajout Ă  la file
                tache.avancer(25) # Avancer la tĂąche de 25 minutes
    
            # Si la tĂąche n'est pas terminĂ©e, la rĂ©insĂ©rer dans la file avec mĂȘme prioritĂ©
            if not tache.est_terminee():
                        ajouter_file_prio(f, tache, prio)
    
    
        return execution