Fraction☘
On veut représenter les nombres rationnels (rapport de deux entiers) avec des chaînes de caractères. Par exemple, la fraction \frac{-12}{5} sera représentée par la chaîne "-12/5".
Numérateur☘
Ecrire un corps possible pour la fonction spécifiée comme suit:
def numerateur(fraction):
"""
fraction -- type str, forme a/b où a et b sont constitués de chiffres
et éventuellement des symboles '+', '-'.
renvoie l'entier a.
>>> numerateur("12/5")
12
>>> numerateur("1/25")
1
>>> numerateur("-641/17")
-641
"""
Solution
Un code possible:
def numerateur(fraction):
"""
fraction -- type str, forme a/b où a et b sont constitués de chiffres
et éventuellement des symboles '+', '-'.
renvoie l'entier a.
>>> numerateur("12/5")
12
>>> numerateur("1/25")
1
>>> numerateur("-641/17")
-641
"""
resultat = ''
indice = 0
while fraction[indice] != '/':
resultat = resultat + fraction[indice]
indice += 1
return int(resultat)
import doctest
doctest.testmod(verbose=True)
Solution
Une version avec une boucle for et l'instruction break
pour sortir de la boucle
lorsque la barre de fraction est atteinte:
def numerateur(fraction):
"""
fraction -- type str, forme a/b où a et b sont constitués de chiffres
et éventuellement des symboles '+', '-'.
renvoie l'entier a.
>>> numerateur("12/5")
12
>>> numerateur("1/25")
1
>>> numerateur("-641/17")
-641
"""
resultat = ''
for caractere in fraction:
if caractere != '/':
resultat = resultat + caractere
else:
break
return int(resultat)
import doctest
doctest.testmod(verbose=True)
Dénominateur☘
Proposez de même un code qui prend en argument une fraction sous la forme précédente et qui renvoie le dénominateur (de type int).
Solution
def denominateur(fraction):
"""
fraction -- type str, forme a/b où a et b sont constitués de chiffres
et éventuellement des symboles '+', '-'.
renvoie l'entier a.
>>> denominateur("12/-5")
-5
>>> denominateur("1/+25")
25
>>> denominateur("-641/17")
17
"""
# on commence par parcourir le numérateur:
indice = 0
caractere = fraction[indice]
while caractere != '/':
indice += 1
caractere = fraction[indice]
# à ce stade, indice est l'indice du symbole /.
# on concatène les caractères situés après le symbole /:
den = ''
for k in range(indice+1, len(fraction)):
den += fraction[k]
return int(den)
import doctest
doctest.testmod(verbose=True)
Solution
Le même script avec une boucle for
à la place de la boucle while
:
def denominateur(fraction):
"""
fraction -- type str, forme a/b où a et b sont constitués de chiffres
et éventuellement des symboles '+', '-'.
renvoie l'entier a.
>>> denominateur("12/-5")
-5
>>> denominateur("1/+25")
25
>>> denominateur("-641/17")
17
"""
# on commence par parcourir le numérateur:
for indice, caractere in enumerate(fraction):
if caractere == '/': break
# à ce stade, indice est l'indice du symbole /.
# on concatène les caractères situés après le symbole /:
den = ''
for k in range(indice+1, len(fraction)):
den += fraction[k]
return int(den)
import doctest
doctest.testmod(verbose=True)
Somme☘
Écrire maintenant une fonction qui prend deux fractions (données sous la forme décrite précédemment) en paramètres et renvoie la fraction somme (de même type et forme que les fractions données en entrée).
def somme(p, q):
"""
p -- type str, forme a/b où a et b sont constitués de chiffres
et éventuellement des symboles '+', '-'.
q -- type str, forme a/b où a et b sont constitués de chiffres
et éventuellement des symboles '+', '-'.
renvoie la fraction somme p+q (fraction représentée comme les entrées)
>>> somme("1/2", "1/3")
'5/6'
>>> somme("-4/5", "7/2")
'27/10'
>>> somme("4/-5", "7/2")
'-27/-10'
"""
Solution
def numerateur(fraction):
"""
fraction -- type str, forme a/b où a et b sont constitués de chiffres
et éventuellement des symboles '+', '-'.
renvoie l'entier a.
>>> numerateur("12/5")
12
>>> numerateur("1/25")
1
>>> numerateur("-641/17")
-641
"""
num = ''
for caractere in fraction:
if caractere != '/':
num += caractere
else:
break
return int(num)
def denominateur(fraction):
"""
fraction -- type str, forme a/b où a et b sont constitués de chiffres
et éventuellement des symboles '+', '-'.
renvoie l'entier a.
>>> denominateur("12/-5")
-5
>>> denominateur("1/+25")
25
>>> denominateur("-641/17")
17
"""
# on commence par parcourir le numérateur:
for indice, caractere in enumerate(fraction):
if caractere == '/': break
# à ce stade, indice est l'indice du symbole /.
# on concatène les caractères situés après le symbole /:
den = ''
for k in range(indice+1, len(fraction)):
den += fraction[k]
return int(den)
def somme(p, q):
"""
p -- type str, forme a/b où a et b sont constitués de chiffres
et éventuellement des symboles '+', '-'.
q -- type str, forme a/b où a et b sont constitués de chiffres
et éventuellement des symboles '+', '-'.
renvoie la fraction somme p+q (fraction représentée comme les entrées)
>>> somme("1/2", "1/3")
'5/6'
>>> somme("-4/5", "7/2")
'27/10'
>>> somme("4/-5", "7/2")
'-27/-10'
"""
nump, denp = numerateur(p), denominateur(p)
numq, denq = numerateur(q), denominateur(q)
num = nump * denq + numq * denp
den = denp * denq
return str(num) + '/' + str(den)
import doctest
doctest.testmod(verbose=True)