Corrigé Sujet N°8
- Flottants & Erreurs -
Le Dossier ZIP de l'épreuve pratique N°8 se situe à l'adresse suivante :
https://sujets.examens-concours.gouv.fr/delos/api/file/public/69c4f0bdcb85140736350717
https://sujets.examens-concours.gouv.fr/delos/api/file/public/69c4f0bdcb85140736350717
La version du fichier Python corrigé est accessible à l'adresse suivante :
https://clem2429.github.io/Correction-Sujets-NSI-2026/corrige/addition_BCD_corrige.py
https://clem2429.github.io/Correction-Sujets-NSI-2026/corrige/addition_BCD_corrige.py
- Ce sujet est le N°8 de la banque des sujets pratiques de NSI 2026;
- Ce sujet (corrigé) comporte 4 questions ;
- Chaque réponse à une question se trouve sur une page distincte.
Vous pouvez téléchargez les éléments suivants en cliquant sur les boutons associés :
Question 1
La chaîne de restauration “RESTO NSI” comprend 1 000 restaurants qui délivrent chacun 500 menus par jour. Un menu est composé d’une entrée à 2.27 €, d’un plat à 5.19 € et d’un dessert à 1.81 €.
Écrire, dans le fichier
Afficher le résultat de cette fonction. Sachant que la valeur théorique exacte est de 4 635 000 €, justifier le comportement observé.
Écrire, dans le fichier
addition_BCD.py, une fonction calcul_recettes() qui additionne le prix de chaque menu vendu dans la journée en utilisant une boucle.
Afficher le résultat de cette fonction. Sachant que la valeur théorique exacte est de 4 635 000 €, justifier le comportement observé.
def calcul_recettes():
s = 0
for k in range(1000):
for i in range(500):
s += 2.27 + 5.19 + 1.81
return s
# Appel de la fonction dans la console :
calcul_recettes()
La fonction renvoie
4634999.999986519, cette réponse approximative et éronnée fait suite à la mauvaise de représentation des flottants du langage Python.
Question 2
Écrire la fonction
Ajouter une assertion pour vérifier que
convertir_BCD_vers_decimal(liste_quartets) qui prend en paramètre une liste de chaînes de caractères représentant des quartets BCD, et renvoie lacvaleur décimale correspondante (de type float).
Ajouter une assertion pour vérifier que
convertir_BCD_vers_decimal(['0001', '0011', '0101', '0110']) renvoie bien la valeur 13.56.
def simulation_simple(population, nb_proies):
for k in range(1, 31):
population, nb_proies = evolution(population, nb_proies)
res = (len(population), nb_proies, k)
if len(population) == 0:
print("Plus de coccinelles !") # Facultatif mais pas inutile
return res
elif nb_proies == 0:
print("Plus de pucerons !") # Facultatif mais pas inutile
return res
return res
Question 3
Écrire la documentation et les commentaires de la méthode
chasser.
Voici l'une des réponses possibles :
def chasser(self, nb_proies, nb_coccinelles):
'''
Méthode prenant en paramètre 1 coccinelle de type Coccinelle,
un nombre de proies nb_proies et un nombre de coccinelles nb_coccinelles
Renvoie le nombre de proies qui reste après que la coccinelle ait consommé x proies
Le nombre de consommation est calculé via des moyennes et du hasard en random
'''
# Si le nombre de coccinelles présentes pour chasser est nul, le nombre de poids reste tel quel
if nb_coccinelles == 0:
return nb_proies
# On calcule le nombre de proies qui sera attribué par coccinelle
proies_par_cocci = nb_proies / nb_coccinelles
# On affecte un nombre de proies consommées selon le nombre de proies par coccinelles
if proies_par_cocci > 20:
consomme = random.randint(12, 20)
elif proies_par_cocci > 10:
consomme = random.randint(8, 15)
else:
consomme = random.randint(3, 8)
# On affecte à consomme la valeur minimale entre une donnée hasardeuse (consomme elle-même)et le nombre de poids
consomme = min(consomme, nb_proies)
# On gère le niveau de nutrition d'une coccinelle selon le nombre de proies consommées
if consomme >= 10:
self.niv_nutrition += 1
else:
self.niv_nutrition = max(0, self.niv_nutrition - 1)
# On renvoie le nombre de proies qui reste après que notre coccinelle en ait consommé x
return nb_proies - consomme
Question 4
Modifier les méthodes
Tester à nouveau la simulation globale pour observer les changements.
reproduction et a_survecu de la classe Coccinelle afin d’y intégrer ces deux nouvelles règles biologiques (la maturité sexuelle et l’impact mortel du manque de nourriture).
Tester à nouveau la simulation globale pour observer les changements.
Pour rappel des modifications à effctuer :
• Les coccinelles ne peuvent se reproduire qu'à partir de 20 jours de vie ;
• Si le niveau de nutrition d'une coccinelle est nul, elle a 1 chance sur 3 de survivre.
• Les coccinelles ne peuvent se reproduire qu'à partir de 20 jours de vie ;
• Si le niveau de nutrition d'une coccinelle est nul, elle a 1 chance sur 3 de survivre.
# Version corrigée :
def reproduction(self):
"""
Une femelle avec un niveau de nutrition >= 2 engendre exactement
deux descendants : un mâle et une femelle.
"""
descendants = []
# On ajoute self.age >= 20 puisque c'est à partir de 20 jours de vie
if self.sexe == "femelle" and self.niv_nutrition >= 2 and self.age >= 20:
descendants.append(Coccinelle("male", 0, 0))
descendants.append(Coccinelle("femelle", 0, 0))
self.niv_nutrition = 0
return descendants
# Version corrigée :
def a_survecu(self):
"""
Met à jour l'âge de la coccinelle et indique si elle est encore en vie.
"""
# Si niv_nutrition est nulle, et que le hasard donne 3 (ici considérés comme mortel), on indique False
if self.niv_nutrition == 0:
if random.randint(1, 3) == 3:
return False
self.age = self.age + 1
return self.age < self.esperance_de_vie
© 2026 - Clément Legoubé