================================================================================ EXERCICE 1 ================================================================================ A : Liste des noms/entêtes des méthodes de la classe "bag" L'exemple d'exécution ne fournit pas de noms explicites de méthodes pour la classe "polyno". Toutes les méthodes utilisées sont des méthodes spéciales (__xxx__) appelées par le mécanisme de traduction automatique de code. Pour cet exercice (comme c'était indiqué au début de la question), il fallait relire le code de la classe 'vec3' vue en cours pour avoir quasiment toutes les réponses. On utilise également la notation '*' pour le constructeur (comme on l'avait fait pour les classes 'deq' et 'color' en TD) afin d'autoriser un nombre variable de paramètres, qui vont correspondre aux différents coefficients du polynôme. - def __init__(self, *items): """initialize bag by storing all provided items""" - def __repr__(self): """return object representation for 'self'""" - def __call__(self): """get current content of 'self'""" - def __len__(self): """get total number of items in 'self'""" - def __contains__(self, item): """check inclusion of item in 'self'""" - def __iadd__(self, *items): """insert provided items into 'self'""" - def __isub__(self, peer): """remove provided ites from 'self'""" - def values(self): """return values stored in 'self'""" - def counters(self): """return counters for values stored in 'self'""" -------------------------------------------------------------------------------- B : Code de la méthode "counters" On suppose que le constructeur a stocké les données dans un attribut caché self._bag qui est de type dictionnaire. Comme dit dans le sujet, les clés de ce dictionnaire sont les éléments (distincts) présents dans le 'bag' et les valeurs de ce dictionnaire sont les compteurs d'occurrences. Donc renvoyer le tuple regroupant les compteurs, consiste simplement à utiliser la méthode self._bag.values() standard d'un dictionnaire et à convertir son résultat en 'tuple' : def counters(self): """return counters for values stored in 'self'""" return tuple(self._bag.values()) -------------------------------------------------------------------------------- C : Code de la méthode "__iadd__" L'addition d'un tuple à un 'bag' consiste à rajouter les éléments de ce tuple dans le dictionnaire self._bag. Il suffit d'itérer sur les éléments, et soit d'incrémenter le compteur si l'élément est déjà dans 'self._bag', soit insérer un nouvel élément avec un compteur égal à 1. On peut éviter un 'if' pour distinguer les deux cas, en utilisant la méthode 'get' (cf. la doc sur les dictionnaires Python) : def __iadd__(self, *items): """insert provided items into 'self'""" for item in items: self._bag[item] = self._bag.get(item,0) + 1 return self ================================================================================ EXERCICE 2 ================================================================================ Voici le code du constructeur : def __init__(self, N=4): """create the main window and pack the widgets""" assert N in {4,5,6}, "wrong value for N" Win.__init__(self, title='Checker', font='Arial 15 bold', op=5) names = ('white-cell','black-cell','black-pawn','white-pawn') image = tuple(Image(f"{n}.gif") for n in names) # -------------------------------------------------------------------------- M = 2*N+1; rows = ' ABCDEFGHIJKL'[:M]; cols = range(1,M) board = Frame(self, fold=M, flow='SE', op=0) for col in range(M): Label(board, text=rows[col]) for row in range(2*N): if col == 0: Label(board, text=cols[row], width=2); continue state = (row+col) % 2 # state 0 or 1 for white or black cells state *= (1 + (row > N) + 2*(row < N-1)) # add 1 for black, 2 for white Button(board, image=image, state=state, border=0) # -------------------------------------------------------------------------- self.loop() - On limite N aux 3 valeurs autorisées avec un 'assert' - On charge les images, qui vont correspondre aux 4 états 0/1/2/3 - On remplit la fenêtre colonne par colonne, de haut en bas ================================================================================