TD2 : Exercices type bac - POO et récursivité

✏️ Tout ce TD est à faire sur le cahier, sans ordinateur (préparation bac/DS).

Exercice 1 :

Les participants à un jeu de LaserGame sont répartis en équipes et s'affrontent dans ce jeu de tir, revêtus d'une veste à capteurs et munis d'une arme factice émettant des infrarouges.

Les ordinateurs embarqués dans ces vestes utilisent la programmation orientée objet pour modéliser les joueurs. La classe Joueur est définie comme suit :

class Joueur:
    def __init__(self, pseudo, identifiant, equipe):
        '''constructeur'''
        self.pseudo = pseudo
        self.equipe = equipe
        self.id = identifiant
        self.nb_de_tirs_emis = 0
        self.liste_id_tirs_recus = []
        self.est_actif = True

    def tire(self):
        '''méthode déclenchée par l'appui sur la gachette'''
        if self.est_actif == True:
            self.nb_de_tirs_emis = self.nb_de_tirs_emis + 1

    def est_determine(self):
        '''methode qui renvoie True si le joueur réalise un grand nombre de tirs'''
        return self.nb_de_tirs_emis > 500

    def subit_un_tir(self, id_recu):
        '''méthode déclenchée par les capteurs de la veste'''
        if self.est_actif:
            self.est_actif = False
            self.liste_id_tirs_recus.append(id_recu)
  1. Comment déclarer un objet joueur1, instance de la classe Joueur, correspondant à un joueur dont le pseudo est "Sniper", l'identifiant est 319 et qui est intégré à l'équipe "A" ?

  2. La méthode subit_un_tir réalise les actions suivantes : lorsqu'un joueur actif subit un tir capté par sa veste, l'identifiant du tireur est ajouté à l'attribut liste_id_tirs_recus et l'attribut est_actif prend la valeur False (le joueur est désactivé). Il doit alors revenir à son camp de base pour être de nouveau actif.

    1. Écrire la méthode redevenir_actif qui rend à nouveau le joueur actif uniquement s'il était précédemment désactivé.
    2. Écrire la méthode nb_de_tirs_recus qui renvoie le nombre de tirs reçus par un joueur en utilisant son attribut liste_id_tirs_recus.
  3. Lorsque la partie est terminée, les participants rejoignent leur camp de base respectif où un ordinateur, qui utilise la classe Base, récupère les données.

La classe Base est définie par :

def collecte_information(self, participant):
    if participant.equipe == self.equipe :  # test 1
        for id in participant.liste_id_tirs_recus:
            if self.est_un_id_allie(id):  # test 2
                self.incremente_score(-20)
            else:
                self.incremente_score(-10)
  1. Indiquer le numéro du test (test 1 ou test 2) qui permet de vérifier qu'en fin de partie un participant égaré n'a pas rejoint par erreur la base adverse.
  2. Décrire comment varie quantitativement le score de la base lorsqu'un joueur de cette équipe a été touché par le tir d'un coéquipier.

On souhaite accorder à la base un bonus de 40 points pour chaque joueur particulièrement déterminé (qui réalise un grand nombre de tirs).

  1. Recopier et compléter, en utilisant les méthodes des classes Joueur et Base, les 2 lignes de code suivantes qu'il faut ajouter à la fin de la méthode collecte_information :
........  #si le participant réalise un grand nombre de tirs
    .........  #le score de la Base augmente de 40

Exercice 2 :

  1. Voici une fonction codée en Python :

def f(n):
    if n == 0:
        print("Partez!")
    else:
        print(n)
        f(n-1)
  1. Qu'affiche l'appel f(5) ?
  2. Pourquoi dit-on de cette fonction qu'elle est récursive ?
  1. On a besoin, pour les questions suivantes, de pouvoir ajouter une chaîne de caractères s en préfixe à chaque chaîne de caractères d'une liste liste. On appellera cette fonction ajouter. Par exemple, ajouter("a", ["b", "c"]) doit retourner ["ab", "ac"].

    1. Recopiez le code suivant et complétez ................. sur votre copie :

      def ajouter(s, liste):
          res = []
          for m in liste:
              res.................
          return res
    2. Que renvoie l'appel ajouter("b", ["a","b","c"]) ?
    3. Que renvoie l'appel ajouter("a", [""]) ?
  1. On s'intéresse ici à la fonction suivante écrite en Python où s est une chaîne de caractères et n un entier naturel.

    def produit(s, n):
        if n == 0:
            return [""]
        else:
            res = []
            for i in range(len(s)):
                res = res + ajouter(s[i], produit(s, n-1))
            return res
    1. Que renvoie l'appel produit("ab", 0) ? Le résultat est-il une liste vide ?
    2. Que renvoie l'appel produit("ab", 1) ?
    3. Que renvoie l'appel produit("ab", 2) ?

Exercice 3 :

Un fabricant de brioches décide d'informatiser sa gestion des stocks. Il écrit pour cela un programme en langage Python. Une partie de son travail consiste à développer une classe Stock dont la première version est la suivante :

class Stock:
    def __init__(self):
        self.qt_farine = 0  # quantité de farine initialisée à 0 g
        self.nb_oeufs = 0   # nombre d'œufs (0 à l'initialisation)
        self.qt_beurre = 0  # quantité de beurre initialisée à 0 g
  1. Écrire une méthode ajouter_beurre(self, qt) qui ajoute la quantité qt de beurre à un objet de la classe Stock.

On admet que l'on a écrit deux autres méthodes ajouter_farine et ajouter_oeufs qui ont des fonctionnements analogues.

  1. Écrire une méthode afficher(self) qui affiche la quantité de farine, d'œufs et de beurre d'un objet de type Stock. L'exemple ci-dessous illustre l'exécution de cette méthode dans la console :
Console :
>>> mon_stock = Stock()
>>> mon_stock.afficher()
farine: 0
oeuf: 0
beurre: 0
>>> mon_stock.ajouter_beurre(560)
>>> mon_stock.afficher()
farine: 0
oeuf: 0
beurre: 560
  1. Pour faire une brioche, il faut 350 g de farine, 175 g de beurre et 4 œufs. Écrire une méthode stock_suffisant_brioche(self) qui renvoie un booléen : True s'il y a assez d'ingrédients dans le stock pour faire une brioche et False sinon.

  2. On considère la méthode supplémentaire produire(self) de la classe Stock donnée par le code suivant :

    def produire(self):
        res = 0
        while self.stock_suffisant_brioche():
            self.qt_beurre = self.qt_beurre - 175
            self.qt_farine = self.qt_farine - 350
            self.nb_oeufs = self.nb_oeufs - 4
            res = res + 1
        return res

    On considère un stock défini par les instructions suivantes :

    Console :
    >>> mon_stock = Stock()
    >>> mon_stock.ajouter_beurre(1000)
    >>> mon_stock.ajouter_farine(1000)
    >>> mon_stock.ajouter_oeufs(10)
    1. Dans la console, on exécute ensuite l'instruction : mon_stock.produire()
      Quelle valeur s'affiche dans la console ? Que représente cette valeur ?
    2. Dans la console, on exécute ensuite l'instruction : mon_stock.afficher()
      Qu'affiche-t-elle dans la console ?
  1. L'industriel possède n lieux de production distincts et donc n stocks distincts. On suppose que ces stocks sont dans une liste dont chaque élément est un objet de type Stock. Écrire une fonction Python nb_brioches(liste_stocks) possédant pour unique paramètre la liste des stocks et qui renvoie le nombre total de brioches produites.