Aller au contenu

TP - Une utilisation sérieuse

Python s’Objette aux Fractions : Un Voyage dans le Monde des Fractions avec Python

Synopsis

Vous devez créer un module de logiciel éducatif pour aider les élèves à comprendre les fractions en utilisant Python et la programmation orientée objet. Vous allez développer une classe Fraction qui représente une fraction avec deux parties : le numérateur (le nombre au-dessus) et le dénominateur (le nombre en bas). Cette classe devra permettre aux utilisateurs de faire des opérations arithmétiques simples comme l'addition, la soustraction, la multiplication et la division. Elle devra également permettre de comparer les fractions entre elles et garantir que chaque fraction est simplifiée à sa forme la plus simple.

N'oubliez pas de tester vos fonctions ! Cet exercice propose une implémentation des fractions en Python, mais vous pouvez ne pas suivre l'énoncé et proposer votre propre version.

Classes et attributs

Commencez par définir une classe Fraction. Cette classe doit avoir deux attributs : num (numérateur) et denom (dénominateur). Vérifiez que les propriétés nécessaires à nos fractions soient respectées à l'aide de assert.

Indice

Vous pouvez initialiser ces attributs dans la méthode __init__. Assurez-vous que le dénominateur ne soit jamais égal à zéro et que le numérateur et le dénomiateur soient de type int en ajoutant un assert dans la méthode __init__.

Méthodes

Ajoutez une méthode simplifier à la classe. Cette méthode doit simplifier la fraction en réduisant le numérateur et le dénominateur à leur plus petit commun diviseur. Une fois réalisé, appelez cette méthode à la fin de la méthode __init__.

Ajoutez ensuite une méthode __str__ pour pouvoir afficher convenablement les fractions sur une seule ligne (par exemple 3/4).

Indice

Vous pouvez utiliser l’algorithme d’Euclide pour trouver le plus grand commun diviseur. Consultez l’article Wikipédia sur l’algorithme d’Euclide pour plus de détails.

Surcharge d’opérateurs :

Vous devez maintenant surcharger les opérateurs +, -, *, /. Ces méthodes doivent retourner une nouvelle instance de Fraction qui est le résultat de l’opération. N'oubliez pas de vérifier le type du deuxième objet :

def __add__(self, autre):
    assert type(autre) == Fraction, "Impossible d'additionner une fraction avec autre chose qu'une fraction"
    ....

Rajoutez ensuite la surcharge du == et de la comparaison.

Pour cela, vous devez définir les méthodes spéciales __add__, __sub__, __mul__ et __truediv__ qui prennent en argument une autre instance de Fraction. Consultez la documentation Python sur les méthodes spéciales pour plus d’informations.

Pour la surcharge du == et de la comparaison, vous devez utiliser les opérateurs présents sur la documentation Python (de __lt__ à __ge__)

Enfin, surchargez la transformation en entier et en flottant avec __int__ et __float__.

Pour les plus rapides

Modifiez les surchages d'opérateurs afin d'accepter les calculs avec d'autres objets que des fractions. Par exemple, Fraction(1,2) + 1 doit valoir la fraction 3/2. Vous pouvez vérifier le type comme ceci :

def __add__(self, autre):
    if type(autre) == int:
        ...
    elif type(autre) == float:
        ...
    else:
        ...

Rajoutez également des tests avec des nombres aléatoires permettant de vérifier que tout est fonctionnel.