================================================================================ EXERCICE 1 ================================================================================ A : Liste des noms/entêtes des méthodes de la classe "polyno" 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, *coeffs): """initialize polynomial by storing its coefficients as a tuple""" - def __repr__(self): """return object representation for 'self'""" - def __str__(self): """return string representation for 'self'""" - def __call__(self, *coeffs): """get current polynomial or set polynomial with 'coeffs'""" - def __len__(self): """get degree of current polynomial""" - def __add__(self, peer): """addition between 'self' and 'peer'""" - def __sub__(self, peer): """subtraction between 'self' and 'peer'""" - def __mul__(self, scalar): """multiplication between 'self' and 'scalar'""" -------------------------------------------------------------------------------- B : Code de la méthode "__str__" L'algorithme de la méthode "__str__" consiste à itérer sur les différents monômes qui composent le polynôme, et à transformer chaque monôme en chaîne de caractères qui seront fusionnées à l'arrivée. Tous les monômes avec des coefficients nuls sont écartés, et on rajoute un signe '+' pour tous les monôme avec un coefficient positif. Le terme constant (qui n'utilise pas '*x') et le terme linéaire (qui n'utilise pas '**p') sont traités à part. def __str__(self): """return string representation for 'self'""" # create (degree,coeff) couples for all polynomial terms terms = [(p,coeff) for p,coeff in enumerate(self.coeffs)] for p,coeff in terms: # loop over polynomial terms if coeff == 0: terms[p] = ''; continue # skip null term sign, coeff = '+-'[coeff < 0], abs(coeff) # split sign and value for coeff if p == 0: terms[p] = f"{sign}{coeff}" # process constant term elif p == 1: terms[p] = f"{sign}{coeff}*x" # process linear term else: terms[p] = f"{sign}{coeff}*x**{p}" # process all other terms return ''.join(terms).strip('+') # merge terms and remove leading '+' sign -------------------------------------------------------------------------------- C : Code de la méthode "__add__" L'addition de deux polynômes consiste simplement à additionner les coefficients des monômes de même degré. La seule difficulté est rencontrée lorsque les deux polynômes ont des degrés différents, puisqu'il faut dans ce cas, rajouter des termes nuls pour le polynôme de plus petit degré, afin qu'il y ait le même nombre de coefficients pour les deux, avant de faire la somme. Comme les coeffs sont stockés dans des tuples pour notre implémentation, il suffit de concaténer au tuple le plus court, un tuple composé des zéros manquants. def __add__(self, peer): """addition between 'self' and 'peer'""" ca, cb = self.coeffs, peer.coeffs # get coefficents for both polynomials da, db = len(self), len(peer) # get degrees for both polynomials if da < db: ca += (0,) * (db-da) # add missing zeros to 'ca' when da < db elif da > db: cb += (0,) * (da-db) # add missing zeros to 'cb' when da > db add = (a+b for a,b in zip(ca,cb)) # create tuple for added coefficents return polyno(*add) # create new polynomial corresponding to self + peer ================================================================================ EXERCICE 2 ================================================================================ Voici le code d'une implémentation complète de la classe demandée (on utilise un flow='ES' pour la fenêtre, afin de créer les 2 colonnes séparément, et un fold=7 pour la colonne de droite, afin de créer des lignes de 7 widgets) class Colors(Win): """edit an RGB color with a set of buttons""" # ---------------------------------------------------------------------------- def __init__(self): """create the main window and pack the widgets""" Win.__init__(self, title='COLORS', font='Arial 14', flow='ES', op=5) # -------------------------------------------------------------------------- frame1 = Frame(self) Label(frame1, text='#000000', grow=False, width=9, border=1) Brick(frame1, bg='#000', width=150, height=100) # -------------------------------------------------------------------------- frame2 = Frame(self, flow='ES', fold=7, border=1) for color in 'RGB': # create 1 Label and 6 Buttons for each color R/G/B Label(frame2, text=color + ' : ', width=4, bg='#CCC') Button(frame2, text='00', width=4); Button(frame2, text='<<', width=4) Button(frame2, text='< ', width=4); Button(frame2, text='> ', width=4) Button(frame2, text='>>', width=4); Button(frame2, text='FF', width=4) # -------------------------------------------------------------------------- self.loop() ================================================================================