Maths & NSI

Baccalauréat — Asie/Pacifique Jour 2 — 2022 — NSI

Bac NSI — Asie/Pacifique 2022 (Jour 2)

Sujet

Présentation de l'épreuve

Session 2022, Jour 2 (code officiel 22-NSIJ2JA1, centre Asie/Pacifique). Durée : 3h30, calculatrice interdite. Le candidat choisit 3 exercices parmi les 5 proposés, chacun noté sur 4 points.

Exercice 1 — Système d'exploitation Linux (commandes, module os)

L'entreprise capNSI gère les contrats de ses clients dans des sous-dossiers du dossier Contrats, sur un ordinateur sous distribution Linux. On observe, dans une console :

gestion@capNSI-ordinateur_central:~$ ls
Bureau Documents Modèles Public Téléchargements Contrats Images Musique Vidéos

Question 1. Quel est le nom de l'utilisateur et de l'ordinateur ? Écrire l'instruction affichant le contenu du dossier Contrats depuis ~.

L'entreprise veut créer, pour un nouveau client Alan Turing, un sous-dossier TURING_Alan dans Contrats, avec tous les droits pour l'utilisateur et le groupe, et lecture seule pour les autres.

Question 2. Écrire les instructions créant ce sous-dossier depuis la racine, puis lui attribuant les bons droits (commande chmod).

En Python, le module os permet ces opérations : os.mkdir("Contrats/TURING_Alan"), os.chmod("Contrats/TURING_Alan", 774).

tab_clients = [
    ('LOVELACE', 'Ada'), ('BOOLE', 'George'), ('VONNEUMANN', 'John'),
    ('SHANNON', 'Claude'), ('KNUTH', 'Donald'),
]

Question 3. Écrire formatage(tab), qui transforme un tableau de couples (Nom, Prénom) en tableau de chaînes "NOM_Prenom". Exemple : formatage(tab_clients) renvoie ['LOVELACE_Ada', 'BOOLE_George', 'VONNEUMANN_John', 'SHANNON_Claude', 'KNUTH_Donald'].

Question 4. Écrire creation_dossiers(tab), qui crée un dossier par chaîne de tab (dans Contrats) avec les mêmes droits que TURING_Alan.

Exercice 2 — Arbres binaires de recherche

Un arbre binaire de recherche a chaque nœud supérieur ou égal aux étiquettes de son sous-arbre gauche, et strictement inférieur à celles de son sous-arbre droit (ordre alphabétique : APOLLINAIRE < BAUDELAIRE). Un arbre A1 a pour racine ELUARD, fils gauche ARAGON (lui-même de fils gauche APOLLINAIRE), fils droit VOLTAIRE.

Question 1. a. Insérer successivement dans A1, dans cet ordre : DUMAS, HUGO, ZWEIG, ZOLA. Décrire l'arbre obtenu. b. Taille et hauteur de l'arbre obtenu (un nœud seul a pour hauteur 1) ? c. Pour une hauteur hh, quel est le nombre maximal de nœuds ?

On définit l'équilibre d'un arbre : 0 s'il est vide, sinon la différence des hauteurs de ses sous-arbres gauche et droit. Un arbre est équilibré si son équilibre vaut -1, 0 ou 1. Un arbre A2 a pour racine KAFKA, fils gauche DURAS (feuille), fils droit SAGAN (lui-même de fils droit SIMENON) : son équilibre vaut 1−2=−11-2=-1.

Question 2. Compléter A2 avec FLAUBERT, BALZAC, PROUST, SAND, WOOLF, COLETTE, CHRISTIE, AUDIARD (en choisissant l'ordre d'insertion) de manière à ce que l'arbre reste équilibré à tout moment.

On donne la fonction :

def mystere(abr, t):
    if abr is None:
        return False
    elif valeur(abr) == t:
        return True
    else:
        return mystere(fils_gauche(abr), t) or mystere(fils_droit(abr), t)

Question 3. Que renvoie mystere(A2, 'SIMENON') ? Justifier.

Question 4. Écrire une fonction récursive hauteur(abr), qui renvoie la hauteur d'un arbre binaire quelconque.

Exercice 3 — Le jeu de la vie

Le jeu de la vie se joue sur une grille où chaque cellule est vivante (1) ou morte (0), avec 8 voisines (horizontales, verticales, diagonales). Règles : une cellule morte avec exactement 3 voisines vivantes naît ; une cellule vivante avec 2 ou 3 voisines vivantes survit, sinon elle meurt. On modélise une grille 8×8 par une liste de listes.

Question 1. a. Entre les deux scripts suivants, lequel initialise correctement un tableau de 0 ?

# Choix 1
ligne = [0,0,0,0,0,0,0,0]
jeu = []
for i in range(8):
    jeu.append(ligne)
# Choix 2
jeu = []
for i in range(8):
    ligne = [0,0,0,0,0,0,0,0]
    jeu.append(ligne)

b. Donner l'instruction plaçant une cellule vivante en jeu[5][2].

Question 2. a. Écrire remplissage(n, jeu), qui place aléatoirement exactement n cellules vivantes dans jeu. b. Quelles préconditions sur n ?

On donne :

def nombre_de_vivants(i, j, jeu):
    nb = 0
    voisins = [(i-1,j-1), (i-1,j), (i-1,j+1), (i,j+1),
               (i+1,j+1), (i+1,j), (i+1,j-1), (i,j-1)]
    for e in voisins:
        if 0 <= ... < 8 and 0 <= ... < 8:
            nb = nb + jeu[...][...]
    return nb

Question 3. Compléter cette fonction (bornes de la grille).

Question 4. En utilisant nombre_de_vivants, écrire transfo_cellule(i, j, jeu), qui renvoie le nouvel état (0 ou 1) de la cellule jeu[i][j].

Exercice 4 — Bases de données : club de tennis

Base pour un club de tennis (réservations en simple) : joueurs(id_joueur, nom_joueur, prenom_joueur, login, mdp) avec (1,Dupont,Alice,alice,1234), (2,Durand,Belina,belina,5694), (3,Caron,Camilia,camilia,9478), (4,Dupont,Dorine,dorine,1347). terrains(id_terrain, nom_terrain, surface) avec (1,stade,terre battue), (2,gymnase,synthétique), (3,hangar,terre battue). creneaux(id_creneau, plage_horaire) avec 12 créneaux d'une heure de 8h à 20h. matchs(id_match, date, id_creneau, id_terrain, id_joueur1, id_joueur2) : (1,2020-08-01,2,1,1,4), (2,2020-08-01,3,1,2,3), (3,2020-08-02,6,2,1,3), (4,2020-08-02,7,2,2,4), (5,2020-08-08,3,3,1,2), (6,2020-08-08,5,2,3,4).

Question 1. Clé primaire de matchs ? A-t-elle des clés étrangères ? Lesquelles ?

Question 2. En lisant les tables : jour et créneau du match entre Durand Belina et Caron Camilia ? Quels sont les deux seuls joueurs à avoir joué dans le hangar ?

Question 3. Requêtes SQL : a) prénoms des joueurs de nom 'Dupont' ; b) mise à jour du mot de passe de Dorine Dupont à '1976'.

Question 4. Requête ajoutant Zora MAGID (login 'zora', mot de passe '2021').

Question 5. Requête donnant les jours où Alice joue.

Exercice 5 — Exécution de programmes, recherche et correction de bugs

Les questions sont indépendantes.

Question 1. somme(n) doit calculer 1+12+13+⋯+1n1+\frac12+\frac13+\dots+\frac1n :

def somme(n):
    total = 0
    for i in range(n):
        total = total + 1/i
    return total

somme(10) déclenche ZeroDivisionError: division by zero. Identifier et corriger le problème.

Question 2.

def maxi(L):
    indice = 0
    maximum = 0
    while indice <= len(L):
        if L[indice] > maximum:
            maximum = L[indice]
        indice = indice + 1
    return maximum

a. maxi([2, 4, 9, 1]) déclenche une erreur. Identifier et corriger. b. Une fois ce bug corrigé, que renvoie maxi([-2, -7, -3]) ? Corriger pour obtenir le bon résultat.

Question 3.

def genere(n):
    L = []
    for i in range(1, n + 1):
        L.append('Joueur ' + i)
    return L

genere(3) déclenche TypeError: can only concatenate str (not "int") to str. Expliquer et corriger.

Question 4.

def suite(n):
    if n == 0:
        return 0
    else:
        return 3 + 2 * suite(n - 2)

a. Que renvoie suite(6) ? b. Que se passe-t-il pour suite(7) ?

Question 5.

x = 4
L = []
def modif(x, L):
    x = x + 1
    L.append(2 * x)
    return x, L
 
print(modif(x, L))
print(x, L)

a. Qu'affiche le premier print ? b. Qu'affiche le second ?

Corrigé