Prérequis : cours sur la POO , exercices sur la POO
À l’issue de ce TP, vous saurez :
- définir une classe avec un constructeur, des attributs et des méthodes ;
- écrire des méthodes qui renvoient un booléen ou une nouvelle instance ;
- vérifier les préconditions d’une méthode par des assertions ;
- manipuler des objets mathématiques (intervalles, fractions) à travers le paradigme objet.
Partie 1 - Intervalles
Le but de cette partie est de construire la classe Intervalle, représentant des
intervalles de nombres réels. La classe possède deux attributs borne_inf et
borne_sup qui représentent respectivement la borne inférieure et la borne
supérieure de l’intervalle. Ces deux bornes seront toujours considérées comme
incluses.
Si borne_sup < borne_inf, l’intervalle est considéré comme vide.
Programmer le constructeur de la classe. Il aura deux paramètres
aetbcorrespondant respectivement àborne_infetborne_sup.Indice
Le constructeur range
adansself.borne_infetbdansself.borne_sup.Écrire une méthode
est_videqui renvoieTruesi l’intervalle est vide,Falsesinon.Indice
L’intervalle est vide lorsque
self.borne_sup < self.borne_inf: renvoyer directement le résultat de cette comparaison, qui vautTrueouFalse.Écrire une méthode
affichagequi renvoie une représentation de l’intervalle sous forme de chaîne de caractères :"[borne_inf; borne_sup]". Si l’intervalle est vide, l’affichage sera :"[ ]".Indice
Traiter d’abord le cas vide en appelant
self.est_vide(). Sinon, construire la chaîne avec une f-string à partir des deux bornes.Écrire une méthode
longueurqui renvoie l’amplitude de l’intervalle. Si l’intervalle est vide, la méthode renvoieNone.Indice
L’amplitude est la différence entre la borne supérieure et la borne inférieure. Si
self.est_vide()est vrai, renvoyerNone.Écrire une méthode
contientde paramètrexqui renvoieTruesi le réelxappartient à l’intervalle,Falsesinon.Indice
xappartient à l’intervalle lorsqueself.borne_inf <= x <= self.borne_sup.Écrire une méthode
equivaut, de paramètre une (autre) instance de la classeIntervalle, qui renvoieTrues’ils sont égaux,Falsesinon. Tous les intervalles vides sont considérés comme égaux.Indice
Le paramètre est un autre objet
Intervalle, appelé par exempleautre: ses bornes s’écriventautre.borne_infetautre.borne_sup. Si les deux intervalles sont vides, ils sont égaux ; sinon, comparer les bornes deux à deux.Code à copier puis compléter
def equivaut(self, autre): if self.est_vide() and autre.est_vide(): return ... return ... and ...Écrire une méthode
inclus, de paramètre une instance deIntervalle, qui renvoieTruesi l’intervalle est inclus dans l’autre,Falsesinon.Indice
Un intervalle vide est inclus dans tout intervalle. Sinon, l’intervalle est inclus dans
autrelorsque ses deux bornes sont comprises entre celles deautre:autre.borne_inf <= self.borne_infetself.borne_sup <= autre.borne_sup.Bonus 1. Écrire une méthode
union, de paramètre une instance de la classeIntervalle, qui renvoie une instance de la classeIntervalledont les bornes correspondent au plus petit intervalle contenant la réunion des deux intervalles.Indice
Si l’un des intervalles est vide, la réunion est simplement l’autre. Sinon, le plus petit intervalle qui contient les deux va de la plus petite des bornes inférieures à la plus grande des bornes supérieures :
minetmaxles donnent. Renvoyer un nouvel objetIntervalle(..., ...).Bonus 2. Écrire une méthode
intersection, de paramètre une instance de la classeIntervalle, qui renvoie une instance de la classeIntervalledont les bornes correspondent à l’intersection entre les deux intervalles.Indice
L’intersection va de la plus grande des bornes inférieures à la plus petite des bornes supérieures. Si elle est vide, l’objet construit le sera aussi, puisque sa borne supérieure sera plus petite que sa borne inférieure.
Correction publiée après la séance.
Partie 2 - Fractions
Le but de cette partie est de construire la classe Fraction, représentant le
quotient de deux nombres relatifs. La classe possèdera deux attributs
numerateur et denominateur.
Programmer le constructeur de la classe. Il aura deux paramètres
aetbcorrespondant respectivement ànumerateuretdenominateur. On vérifiera les préconditions par des assertions : par exemple,assert b != 0, "le dénominateur ne doit pas être nul".Indice
Vérifier d’abord la précondition avec
assert, puis rangeradansself.numerateuretbdansself.denominateur.Écrire une méthode
affichagequi renvoie une représentation de la fraction sous forme de chaîne de caractères :"numerateur/denominateur".Si le dénominateur vaut 1 ou −1, l’affichage ne comportera pas de
"/".Indice
Si le dénominateur vaut 1, renvoyer le numérateur seul ; s’il vaut -1, l’opposé du numérateur (
str(...)convertit un entier en chaîne). Sinon, une f-string place les deux nombres de part et d’autre de/.Écrire une méthode
simplifiequi modifie les attributsnumerateuretdenominateurpour que la fraction soit irréductible. Si la fraction est négative, c’est lenumerateurqui est négatif. Le pgcd se calcule dans cette méthode.Indice
Le pgcd de deux entiers positifs se calcule par l’algorithme d’Euclide : tant que
bn’est pas nul, remplacera, bparb, a % b; le pgcd est alorsa. Diviser ensuite le numérateur et le dénominateur par ce pgcd (division entière//) ; si le dénominateur est négatif, changer le signe des deux.Code à copier puis compléter
def simplifie(self): a, b = abs(self.numerateur), abs(self.denominateur) while b != 0: a, b = ..., ... self.numerateur = self.numerateur // a self.denominateur = ... if self.denominateur < 0: self.numerateur = ... self.denominateur = ...Écrire une méthode
egalde paramètre une instance de la classeFraction, qui renvoieTruesi les deux fractions sont égales,Falsesinon.Indice
Deux fractions a/b et c/d sont égales lorsque a × d = b × c (produit en croix) : pas besoin de les simplifier.
Écrire une méthode
produitde paramètre une instance de la classeFraction, qui renvoie une instance de la classeFractioncorrespondant au produit des deux fractions. La nouvelle instance sera irréductible.Indice
Le produit de a/b par c/d vaut (a × c)/(b × d) : construire la nouvelle
Fraction, appeler sa méthodesimplifie(), puis la renvoyer.Écrire une méthode
quotient, de paramètre une instance de la classeFraction, qui renvoie une instance de la classeFractioncorrespondant au quotient des deux fractions. La nouvelle instance sera irréductible.Indice
Diviser par c/d revient à multiplier par d/c, à condition que c ne soit pas nul.
Écrire une méthode
sommede paramètre une instance de la classeFraction, qui renvoie une instance de la classeFractioncorrespondant à la somme des deux fractions. La nouvelle instance sera irréductible.Indice
a/b + c/d = (a × d + b × c)/(b × d) ; simplifier ensuite la nouvelle fraction.
Correction publiée après la séance.