Baccalauréat — Devoir écrit — 2023 — NSI
NSI Première 2023 — Devoir écrit — mai 2023
Sujet
Devoir écrit de spécialité numérique et sciences informatiques, classe de Première, mai 2023. Le sujet comporte 3 exercices indépendants, à traiter tous les trois. Barème indicatif : exercice 1 (8 points), exercice 2 (4 points), exercice 3 (8 points) — soit 20 points au total.
Exercice 1 (8 points) — Systèmes d'exploitation, programmation et dictionnaires
Cet exercice porte sur les systèmes d'exploitation, la programmation en général et les dictionnaires.
Dans un système d'exploitation de type UNIX, on considère l'arborescence suivante, dans laquelle les noms des répertoires sont en gras et ceux des fichiers en italique.
Le répertoire root contient trois sous-répertoires : home, usr et bin.
homecontient les répertoires personnels de trois utilisateurs :alix, qui contient le répertoirecourset le fichierfich1.py;camille, qui contient le répertoiredevoirs, lequel contient les fichiersDS1.txt,algo.pyetNSI.txt;dominique, qui contient les répertoiresvacancesetdevoirs.
usrcontient les répertoireslocaletetc.bincontient les fichiersloginetcat.
On donne ci-après un extrait de quelques commandes de base à utiliser dans un terminal sous Linux :
| Commande | Effet |
|---|---|
ls | affiche le contenu d'un répertoire (ls repertoire1 affiche le contenu de repertoire1) |
cd | change le répertoire courant (après cd repertoire1, le répertoire courant devient repertoire1) |
cp | crée une copie d'un fichier (cp fichier1.py fichier2.py copie fichier1.py sous le nom fichier2.py) |
mv | déplace ou renomme un fichier ou un répertoire (mv fichier.txt dossier1 déplace fichier.txt dans dossier1) |
rm | supprime un fichier ou un répertoire (rm mon_fichier.mp3 supprime mon_fichier.mp3) |
mkdir | crée un répertoire (mkdir dossier2 crée le répertoire dossier2) |
cat | affiche le contenu d'un fichier (cat fichier1.txt affiche le contenu de fichier1.txt) |
touch | crée un fichier qui n'existait pas jusqu'alors (touch fichier2 crée fichier2) |
Dans l'arborescence décrite ci-dessus, alix, camille et dominique sont respectivement les répertoires personnels des utilisateurs Alix, Camille et Dominique. On souhaite explorer et modifier les répertoires et fichiers grâce à l'utilisation d'un terminal.
1. Dans cette question, la problématique des droits d'accès n'est pas prise en compte.
(a) On suppose que le répertoire courant est camille. Parmi les quatre propositions suivantes, déterminer la commande qui permet d'afficher son contenu : mv, cp, ls, rm.
(b) On suppose toujours que le répertoire courant est camille. Parmi les quatre propositions suivantes, déterminer toutes celles qui permettent que le répertoire cours d'Alix devienne le répertoire courant :
- Proposition 1 :
cd ../alix/cours - Proposition 2 :
cd cours - Proposition 3 :
cd alix/cours - Proposition 4 :
cd /home/alix/cours
(c) On suppose que le répertoire courant est alix. Déterminer l'instruction permettant de copier le fichier fich2.txt, qui se trouve dans le répertoire d'Alix, dans le répertoire devoirs de Camille.
2. Dans cette question, la problématique des droits d'accès est prise en compte. Camille, depuis le répertoire camille/devoirs, utilise la commande ls -l et obtient le résultat suivant :
| Droits | Propriétaire | Groupe | Taille | Date | Fichier |
|---|---|---|---|---|---|
-rw-r--r-- | root | root | 1096 | 22 juil. 17:10 | DS1.txt |
-rw-r--r-- | camille | eleve | 128 | 22 juil. 16:03 | algo.py |
-r--r--r-- | camille | eleve | 128 | 22 juil. 18:21 | NSI.txt |
(a) Expliquer pourquoi l'instruction rm DS1.txt est refusée si l'utilisateur est Camille.
On donne ci-après un extrait du mode d'emploi de la commande chmod :
La commande chmod modifie les permissions d'un fichier ou d'un dossier. Elle prend en paramètres des caractères parmi u (utilisateur), g (groupe), o (autres utilisateurs), + (ajouter des droits), - (supprimer des droits), r (lecture), w (écriture), x (exécution), suivis du nom de fichier. Par exemple, chmod u+rwx o-x exo.py ajoute sur exo.py les droits en lecture, écriture et exécution à l'utilisateur, et supprime le droit d'exécution aux autres utilisateurs.
3. Camille souhaite interdire la lecture du contenu du fichier algo.py aux autres utilisateurs (même ceux de son groupe). Elle souhaite également se donner la possibilité de l'exécuter. Écrire l'instruction permettant de modifier les droits sur algo.py. On suppose que Camille bénéficie déjà des droits nécessaires.
4. Dans son répertoire vacances, Dominique a conservé tous les fichiers créés durant une année. Elle décide de les indexer selon leur type ("photo", "vidéo" ou "son"), le mois de leur création (un entier entre 1 et 12) et leur taille en kilo-octets, puis les stocke dans une liste Python. Un extrait de cette liste :
fichiers_vacances = [
{"nom_fichier": "plage.jpg", "type": "photo", "mois": 7, "taille": 152},
{"nom_fichier": "mouette.mp3", "type": "son", "mois": 7, "taille": 54},
{"nom_fichier": "famille1.png", "type": "photo", "mois": 12, "taille": 257},
](a) Recopier et compléter le code de la fonction classement_type, qui prend en paramètre une liste L au format précédent et qui renvoie trois listes photos, sons et videos, contenant les éléments du type correspondant :
def classement_type(L):
photos = []
sons = []
videos = []
for fichier in ...:
if ... == "photo":
photos.append(fichier)
elif ... == "son":
...
else:
...
return photos, sons, videos(b) Dominique souhaite compter le nombre de photos datant du mois de juillet. Écrire une fonction photo_juillet qui prend en paramètre une liste de fichiers et qui renvoie le nombre de fichiers de type "photo" du mois de juillet.
(c) À partir des fichiers de la liste photos_vacances, Dominique souhaite stocker le plus de fichiers possible sur une clé USB d'une capacité de 64 Go. Proposer une démarche algorithmique pour y parvenir (on ne demande pas de la programmer en Python).
Exercice 2 (4 points) — Adresses IP
Une adresse IPv4 est composée de 4 octets X1.X2.X3.X4, qui peuvent être écrits en notation binaire ou décimale. La notation CIDR X1.X2.X3.X4/n signifie que les n premiers bits de poids fort de l'adresse IP représentent la partie « réseau », les bits suivants la partie « hôte » (machine).
1. (a) Donner le nombre de bits formant un octet.
(b) Déterminer l'écriture décimale de l'adresse IPv4 correspondant à l'écriture binaire :
11000000.10101000.00000100.11110001
2. On considère la machine d'adresse IPv4 172.20.1.242/24.
(a) Donner la notation décimale du masque de sous-réseau de cette machine.
(b) Donner l'adresse décimale de ce réseau.
(c) Donner le nombre maximal de machines que l'on peut connecter sur ce réseau. Expliquer rigoureusement pourquoi.
Exercice 3 (8 points) — Exécution de programmes, recherche et correction de bugs
Les questions proposées sont indépendantes les unes des autres.
1. On considère la fonction somme(n) qui reçoit en paramètre un entier n strictement positif et doit renvoyer le résultat du calcul :
def somme(n):
total = 0
i = 0
while i < n:
total = total + i
return total(a) Lors de l'exécution de somme(4), le programme boucle à l'infini. Corriger le problème pour que le programme s'arrête.
(b) Le bug précédent est maintenant corrigé. Que renvoie à présent l'exécution de somme(4) ? Modifier la fonction pour qu'elle renvoie le bon résultat.
2. On considère la fonction recherche(a, L) qui reçoit en paramètre un entier a et une liste d'entiers L, et qui doit renvoyer True si a appartient à la liste L, False sinon :
def recherche(a, L):
for i in L:
if i = a:
return True
else:
return False(a) Lors de l'exécution de recherche(5, [4, 1, 5, 10]), une erreur est déclenchée (il y a un message d'erreur). Identifier et corriger le problème.
(b) Le bug précédent est maintenant corrigé. Que renvoie à présent l'exécution de recherche(5, [4, 1, 5, 10]) ? Modifier la fonction pour qu'elle renvoie le bon résultat.
3. On considère la fonction sommeInverse(n) qui reçoit en paramètre un entier n strictement positif et doit renvoyer le résultat du calcul :
def sommeInverse(n):
total = 0
for i in range(n):
total = total + 1 / i
return totalLors de l'exécution de sommeInverse(10), le message d'erreur ZeroDivisionError: division by zero apparaît. Identifier le problème avec une phrase, puis corriger la fonction pour qu'elle effectue le calcul demandé.
4. On considère la fonction maxi(L), qui prend comme paramètre une liste L de nombres et doit renvoyer le plus grand nombre de cette liste :
def maxi(L):
indice = 0
maximum = 0
while indice <= len(L):
if L[indice] > maximum:
maximum = L[indice]
indice = indice + 1
return maximum(a) Lors de l'exécution de maxi([2, 4, 9, 1]), une erreur est déclenchée (il y a un message d'erreur). Identifier avec une phrase et corriger le problème.
(b) Le bug précédent est maintenant corrigé. Que renvoie à présent l'exécution de maxi([-2, -7, -3]) ? Modifier la fonction pour qu'elle renvoie le bon résultat.
5. On souhaite réaliser une fonction qui génère une liste de n joueurs identifiés par leur numéro. Par exemple, on souhaite que l'appel genere(3) renvoie la liste ['Joueur 1', 'Joueur 2', 'Joueur 3'].
def genere(n):
L = []
for i in range(1, n + 1):
L.append('Joueur ' + i)
return LL'appel genere(3) déclenche l'erreur suivante : TypeError: can only concatenate str (not "int") to str. Expliquer ce message d'erreur et corriger la fonction afin de régler le problème.
Corrigé
Créez un compte gratuit : votre première correction est offerte.