Maths & NSI

Baccalauréat — Devoir bilan — 2023 — NSI

NSI Première 2023 — Devoir bilan — Dictionnaires

Sujet

Devoir bilan de spécialité numérique et sciences informatiques, classe de Première (1NSI5), Lycée Lyautey, année scolaire 2022-2023. Le sujet comporte 2 exercices indépendants, à traiter tous les deux. Pour les questions 1 à 11 de l'exercice 1, une seule des quatre propositions est correcte ; à partir de la question 12, aucune proposition n'est fournie, il s'agit de donner directement la réponse. Barème indicatif (absent du sujet source, proposé ici à raison d'un point par question) : exercice 1 (15 points), exercice 2 (5 points) — soit 20 points au total.

Exercice 1 (15 points) — Codage, programmation et dictionnaires

Question 1. Quel est l'entier positif codé en base 2 sur 8 bits par le code 00101010 ?

a) 42 — b) 21 — c) 84 — d) 3

Question 2. Quelle est la valeur affichée à l'exécution du programme Python suivant ?

X = 1
for i in range(10):
    X = X * 2
print(X)

a) 1024 — b) 512 — c) 2048 — d) 1

Question 3. Que peut-on dire du programme Python suivant de calcul sur les nombres flottants ?

x = 1.0
while x != 0.0:
    x = x - 0.1

a) L'exécution peut ne pas s'arrêter, si la variable x n'est jamais égale exactement à 0.0. b) À la fin de l'exécution, la variable x vaut -0.000001. c) À la fin de l'exécution, la variable x vaut 0.000001. d) L'exécution s'arrête sur une erreur FloatingPointError.

Question 4. Quelle est l'affirmation vraie concernant le codage UTF-8 des caractères ?

a) Le codage UTF-8 est sur 1 à 4 octets. b) Le codage UTF-8 est sur 8 bits. c) Le codage UTF-8 est sur 8 octets. d) Le codage UTF-8 est sur 7 bits.

Question 5. Avec la définition de fonction f suivante en Python, quelle est la valeur retournée par l'appel f(42, 21) ?

def f(x, y):
    if x > y:
        return y, x
    else:
        return x, y

a) (42, 21) — b) (21, 21) — c) (42, 42) — d) (21, 42)

Question 6. Dans la définition suivante de la fonction somme en Python, quelle est l'instruction à ajouter pour que la valeur retournée par l'appel somme([10, 11, 12, 13, 14]) soit 60 ?

def somme(TAB):
    s = 0
    for i in range(len(TAB)):
        s = ......................
    return s

a) s = TAB[i] — b) s = +TAB[i] — c) s += TAB[i] — d) s = TAB[s + i]

Question 7. Quel est le résultat de l'évaluation de l'expression Python suivante ?

[n * n for n in range(10)]

a) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] b) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100] c) [0, 2, 4, 8, 16, 32, 64, 128, 256, 512] d) [0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

Question 8. Comment peut-on accéder à la valeur associée à une clé dans un dictionnaire ?

a) On peut y accéder directement à partir de la clé. b) Il faut parcourir le dictionnaire avec une boucle à la recherche de la clé. c) On ne peut pas accéder à une valeur contenue dans un dictionnaire à partir d'une clé. d) Il faut d'abord déchiffrer la clé pour accéder à un dictionnaire.

Question 9. Quelle est la valeur affichée à l'exécution du programme Python suivant ?

Ports = {'http': 80, 'imap': 142, 'smtp': 25}
Ports['ftp'] = 29
print(Ports)

a) {'http': 80, 'imap': 142, 'smtp': 25} b) {'http', 'imap', 'smtp', 'ftp'} c) {'http': 80, 'imap': 142, 'smtp': 25, 'ftp': 29} d) {'http': 80, 'imap': 142, 'smtp': 25, ['ftp']: 29}

Question 10. Quelle est l'expression manquante dans le programme Python suivant, pour que son exécution affiche le numéro de téléphone de Dupond ?

repertoire = [{'nom': 'Dupont', 'tel': '5234'},
              {'nom': 'Tournesol', 'tel': '5248'},
              {'nom': 'Dupond', 'tel': '3452'}]
for i in range(len(repertoire)):
    if ... :
        print(repertoire[i]['tel'])

a) repertoire[i]['nom'] == 'Dupond' b) repertoire['nom'] == 'Dupond' c) repertoire[i] == 'Dupond' d) 'nom' == 'Dupond'

Question 11. Laquelle de ces listes de chaînes de caractères est triée en ordre croissant ?

a) ['Chat', 'Cheval', 'Chien', 'Cochon'] b) ['Cochon', 'Chat', 'Cheval', 'Chien'] c) ['Cheval', 'Chien', 'Chat', 'Cochon'] d) ['Chat', 'Cochon', 'Cheval', 'Chien']

À partir de la question suivante, il s'agit de donner directement les réponses aux questions, sans justification : aucune proposition de réponse n'est fournie.

Question 12. Quelle est la valeur de la variable image après exécution du programme Python suivant ?

image = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
for i in range(4):
    for j in range(4):
        if (i + j) == 3:
            image[i][j] = 1

Question 13. Quelle est la valeur de la variable table après exécution du programme Python suivant ?

table = [12, 43, 6, 22, 37]
for i in range(len(table) - 1):
    if table[i] > table[i + 1]:
        table[i], table[i + 1] = table[i + 1], table[i]

Question 14. Quelle est l'expression Python permettant de simuler le tirage d'un dé à 6 faces, après avoir exécuté import random ?

Question 15. Quelle valeur retourne la fonction mystere suivante, dans le cas général, quelle que soit la liste passée en argument ?

def mystere(liste):
    valeur_de_retour = True
    indice = 0
    while indice < len(liste) - 1:
        if liste[indice] > liste[indice + 1]:
            valeur_de_retour = False
        indice = indice + 1
    return valeur_de_retour

Exercice 2 (5 points) — Dictionnaires et liaisons ferroviaires

Cet exercice s'appuie sur le jeu de société « Les Aventuriers du Rail », dans lequel les joueurs construisent des lignes de chemin de fer entre des villes. On étudie ici un extrait des liaisons possibles dans la région Occitanie, entre les villes suivantes (annexe 1) :

  • Auch – Toulouse
  • Toulouse – Montauban
  • Toulouse – St Sulpice ; St Sulpice – Gaillac ; St Sulpice – Albi ; Albi – Rodez
  • Toulouse – Castres ; Castres – Mazamet
  • Toulouse – Muret
  • Toulouse – Castelnaudary ; Castelnaudary – Carcassonne
  • Muret – St Gaudens ; St Gaudens – Tarbes ; Tarbes – Lourdes ; St Gaudens – Luchon
  • Muret – Pamiers ; Pamiers – Foix ; Foix – Ax les Thermes
  • Carcassonne – Limoux ; Limoux – Quillan
  • Carcassonne – Narbonne ; Narbonne – Béziers ; Béziers – Millau ; Millau – Séverac
  • Narbonne – Perpignan

Chacune de ces liaisons est directe : elle ne passe par aucune autre ville de la liste. Par exemple, il n'existe pas de liaison directe entre Toulouse et Mazamet, car la ligne Toulouse–Mazamet passe par Castres.

Liste des liaisons d'un joueur. Toutes les liaisons directes construites par un joueur sont enregistrées dans une variable de type « tableau de tableaux ». Le joueur 1 possède les liaisons directes Toulouse–Muret, Toulouse–Montauban, Gaillac–St Sulpice et Muret–Pamiers (représentées en noir dans l'annexe 2) :

liaisonsJoueur1 = [["Toulouse", "Muret"], ["Toulouse", "Montauban"],
                   ["Gaillac", "St Sulpice"], ["Muret", "Pamiers"]]

Dictionnaire associé à un joueur. On code également les villes et trajets d'un joueur à l'aide d'un dictionnaire de tableaux : chaque clé est une ville de départ, et la valeur associée est un tableau des villes d'arrivée accessibles directement en utilisant les liaisons du joueur. Le dictionnaire du joueur 1 est :

DictJoueur1 = {"Toulouse": ["Muret", "Montauban"], "Montauban": ["Toulouse"],
               "Gaillac": ["St Sulpice"], "St Sulpice": ["Gaillac"],
               "Muret": ["Toulouse", "Pamiers"], "Pamiers": ["Muret"]}

Annexe 2. Dans l'annexe 2, en plus des liaisons du joueur 1 (en noir), les liaisons déjà construites par le joueur 2 sont représentées en blanc : Toulouse–Castres, Toulouse–Castelnaudary, Castres–Mazamet et Castelnaudary–Carcassonne. Toutes les autres liaisons de l'annexe 1 sont encore libres (en gris).

1. Expliquer pourquoi la liste de liaisons suivante n'est pas valide :

tableauliaisons = [["Toulouse", "Auch"], ["Luchon", "Muret"], ["Quillan", "Limoux"]]

2. Cette question concerne le joueur 2.

(a) Donner le tableau liaisonsJoueur2 des liaisons possédées par le joueur 2.

(b) Recopier et compléter le dictionnaire suivant, associé au joueur 2 :

DictJoueur2 = {"Toulouse": ["Castres", "Castelnaudary"], ...}

3. À partir du tableau de tableaux contenant les liaisons d'un joueur, on souhaite construire le dictionnaire correspondant. Une première proposition a abouti à la fonction construireDict ci-dessous :

def construireDict(listeLiaisons):
    """
    listeLiaisons est un tableau de tableaux représentant la
    liste des liaisons d'un joueur comme décrit dans le problème
    """
    Dict = {}
    for liaison in listeLiaisons:
        villeA = liaison[0]
        villeB = liaison[1]
        if not villeA in Dict.keys():
            Dict[villeA] = [villeB]
        else:
            destinationsA = Dict[villeA]
            if not villeB in destinationsA:
                destinationsA.append(villeB)
    return Dict

(a) Donner le résultat de cette fonction appelée sur la variable liaisonsJoueur1 donnée dans l'énoncé, et expliquer en quoi cette fonction ne répond que partiellement à la demande.

(b) La fonction construireDict est donc partiellement inexacte. La compléter pour qu'elle génère bien l'ensemble du dictionnaire de tableaux correspondant à la liste de liaisons donnée en argument. À l'aide des numéros de lignes, préciser où est inséré ce code (on numérotera la ligne def construireDict(listeLiaisons): comme ligne 1).

Corrigé

Corrigé réservé aux abonnés Premium.

Créez un compte gratuit : votre première correction est offerte.

Devoir bilan de Première, NSI5 — Lycée Lyautey, M. Houri.