"""
    Calcul des valeurs et des dérivées de la fonction f(x) = (x^2 + x*sin(x)) / x!
"""
import math

def fact(x:int) -> int:
    """
        Calcul de la factorielle de x pour x entier
    """
    x = int(x) # il fallait utiliser la conversion ici
    if x == 0:
        return 1
    else:
        return x * fact(x-1)
    
def f(x):
    """
        definition de la fonction f(x)
        return (x**2 + x*math.sin(x)) / fact(x) 
    """
    return (x**2 + x*math.sin(x)) / math.factorial(int(x)) 

def derive(i, h=1e-10):
    """
        Calcul de la dérivée de f en i
    """
    return (f(i+h) - f(i)) / h

def main():
    """
        Fonction principale
    """
    for i in range(0,10):
        print(f"{i} {f(i):2.5f} {derive(i):2.5f}")

if __name__ == "__main__":
    main()
