Aller au contenu

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)