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 , 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 .
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 nbQuestion 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 :
def somme(n):
total = 0
for i in range(n):
total = total + 1/i
return totalsomme(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 maximuma. 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 Lgenere(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 ?