Accueil

Corrigé Sujet N°8

- Flottants & Erreurs -









Vous pouvez téléchargez les éléments suivants en cliquant sur les boutons associés :
Dossier (ZIP) Sujet (PDF) Fichier Python Initial
Corrigé V1 (PDF) Fichier Python Corrigé V1

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 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 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 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.

# 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