Python en Mathématiques - Niveau 2

Les rationnels

Plus tard ! Les exercices de cette page peuvent (doivent) être réservés à une seconde lecture.

Le module fractions

Le module fractions est disponible par défaut en Python. Voici quelques exemples d'utilisation de ce module :


from fractions import Fraction


##----- Tests et intercation -----##
print("Fraction 2/3 : ")
a = Fraction('2/3')
print(a)
print(a.numerator)
print(a.denominator)

print()

print("Avec deux entrées (2, 3) : ")
b = Fraction(2,3)
print(b)
print(b.numerator)
print(b.denominator)
 
print()

print("Avec 20/30 : ")
c = Fraction('20/30')
print(c)
print(c.numerator)
print(c.denominator)

On obtient :

Fraction 2/3 : 
2/3
2
3

Avec deux entrées (2, 3) : 
2/3
2
3

Avec 20/30 : 
2/3
2
3

Un autre exemple :


from fractions import Fraction


##----- Tests et intercation -----##
a = Fraction('2/3')
b = Fraction('3/4')
print( a+b )

c = Fraction(input("Entrer un rationnel (sous la forme a/b) : "))
print(c)

On obtient :

17/12
Entrer un rationnel (sous la forme a/b) : 2/3
2/3

Exerciseur

Créer un petit exerciseur concernant les opérations sur les rationnels :

  • Deux fractions et un opérateur (+, -, /, *) sont proposés à l'utilisateur.
  • L'utilisateur doit alors entrer le résultat de l'opération (sous la forme a/b).
  • "Bonne réponse" ou "Mauvaise réponse" s'affiche alors avec le score.
  • On demande à l'utilisateur s'il veut continuer.
  • Un code possible

from fractions import Fraction
from random import randint, choice


##----- Définitions des fonctions -----##
def fraction_au_hasard() :
	# on tire le numérateur au hasard entre 0 et 100 :
	n = randint(0,100)
	# on tire le dénominateur au hasard entre 1 et 50 :
	d = randint(1,50)
	return Fraction(n,d)
	

def operation_au_hasard() :
	# choix d'un opérateur au hasard parmi les 4 :
	op = choice(['+', '-', '*', '/'])
	return op
	
	
	
def resultat(q1, op, q2) :
	"""
	fonction de calcul du résultat.
	"""
	if op == '+' : return q1 + q2
	elif op == '-' : return q1 - q2
	elif op == '*' : return q1 * q2
	elif op == '/' : return q1/q2
	
	
	
##----- Programme principal et interaction -----##
# compteur pour les questions et les bonnes réponses
# pour affichage du score :
compteur_questions = 0
compteur_OK = 0
# variable pour la question continuer/arrêter : 
encore = True

while encore :
	
	q1 = fraction_au_hasard()
	q2 = fraction_au_hasard()
	op = operation_au_hasard()
	if op == '/' :
		q = Fraction(input("Donner la forme irréductible de ({}){}({}).\n".format(q1, op, q2)))
	else :
		q = Fraction(input("Donner la forme irréductible de {}{}{}.\n".format(q1, op, q2)))
		
	compteur_questions += 1
	if q == resultat(q1, op, q2) :
		compteur_OK += 1
		print("Bonne réponse. {} sur {}.".format(compteur_OK, compteur_questions))
	else :
		print("Mauvaise réponse. {} sur {}.".format(compteur_OK, compteur_questions))
		
	encore = int(input("Voulez vous continuer (taper 1) ou non (taper 0) ?"))

Opérations sur les fractions

On définit un type Rationnel (fichier ratio.py) :


class Rationnel:
	def __init__(self, numerateur = 0, denominateur = 1) :
		self.num = numerateur
		self.den = denominateur

	def __str__(self):
		if self.den == 1 :
			return "{}".format(self.num)
		else :
			return "{}/{}".format(self.num, self.den)

La seule opération possible est l'affichage :


from ratio import Rationnel
 
##----- Tests et interaction -----##
a = Rationnel(2, 3)

print(a)
print(a.num)
print(a.den)

donne :

2/3
2
3

Question

Définir des fonctions addition, multiplication, soustraction, division, egalite sur les fractions d'entiers utilisant la structure que l'on vient de définir (placée dans un module).

  • Un code possible

from ratio import Rationnel
from math import gcd
 
 
##----- Définitions des fonctions -----##
def egalite(p, q) :
	return p.num * q.den == p.den * q.num


def addition(p, q):
	num = p.num * q.den + q.num * p.den
	den = p.den * q.den
	pgcd = gcd(num, den)
	return Rationnel( num//pgcd, den//pgcd)
	
	
def soustraction(p, q):
	num = p.num * q.den - q.num * p.den
	den = p.den * q.den
	pgcd = gcd(num, den)
	return Rationnel( num//pgcd, den//pgcd)


def multiplication(p, q):
	num = p.num * q.num 
	den = p.den * q.den
	pgcd = gcd(num, den)
	return Rationnel( num//pgcd, den//pgcd)


def division(p, q):
	num = p.num * q.den 
	den = p.den * q.num
	pgcd = gcd(num, den)
	return Rationnel( num//pgcd, den//pgcd)

 
##----- Tests et interaction -----##
p = Rationnel()
q = Rationnel()

p.num = int(input("Entrer le numérateur du premier rationnel : "))
p.den = int(input("Entrer le dénominateur du premier rationnel : "))

q.num = int(input("Entrer le numérateur du second rationnel : "))
q.den = int(input("Entrer le dénominateur du second rationnel : "))

print("Addition : ")
print( addition(p,q) )
print("Soustraction : ")
print( soustraction(p,q) )
print("Multiplication : ")
print( multiplication(p,q) )
print("Division : ")
print( division(p,q) )
print("Egalité ? ")
print( egalite(p,q) )