Exercices DM2

Pour les 3 exercices suivants, votre tâche est donc :

  • simplifier le code de la fonction en ajoutant une ou plusieurs sous-fonctions.
  • essayer de renommer la fonction et ses variables pour la rendre plus compréhensible selon les critères de documentation vu lors du premier DM

Il n'y a pas de choix unique pour la sous-fonction, un bon choix pouvant être caractérisé par le fait que la sous-fonction ait plusieurs lignes de codes, que son nom résume bien son action et qu'elle soit bien documentée.

Exercice n°1


In [1]:
## n est forcément un entier supérieur ou égal à 1
def f1(n):
    a = True
    k = 2
    while (k < n) and a:
        if n % k == 0:
            a = False
        k = k + 1
    if a:
        print(n)
        return
    
    while n != 1:
        k = 2
        while k <= n:
            if n % k == 0:
                n = n // k
                print(k, end = ' ')
                k = n 
            k = k + 1

Quelques exemples, les résultats ne doivent pas changer (à noter que les consignes sont que le résultat de la fonction ne doit pas changer quelque soit les données d'entrée, pas seulement ces exemples)

Exemple n°1 : affiche 2 2 2 3 5


In [2]:
f1(120)


2 2 2 3 5 

Exemple n°2 : affiche 13 13


In [3]:
f1(169)


13 13 

Exercice n°2

Un nom de la fonction qui indique ce qu'elle fait, c'est déjà la garantie de:

  • Un début de documention
  • Un moyen de retenir comment "invoquer la fonction"
  • Une garantie de ce que l'on ne va pas empiéter sur les fonction système déjà existantes

In [4]:
import random

def simulation_boursiere(c, nb_semaine, v ):
    nb_jours_ouvres = 5
    for it_semaine in range(nb_semaine):
        for it in range(nb_jours_ouvres):
            ## La fonction random renvoit un nombre "pseudo-aléatoire" entre 0 et 1.0
            c = (c + v*(random.random()-0.5))*(1 + 0.001*(random.random() - 0.5))
            if c < 0:
                c = 0
        print( "Cours semaine", it_semaine, ":", c )

Exemple n°1 : cette cellule affiche 5 lignes, et pourrai afficher des valeurs comparables à celles-ci :

Cours semaine 0 : 105.34681237564352  
Cours semaine 1 : 115.73138361821448  
Cours semaine 2 : 121.08482256990295  
Cours semaine 3 : 124.42344691023956  
Cours semaine 4 : 115.73450285503783

A noter si l'on veux absolument les mêmes valeurs, on peut biaiser la fonction random par la méthode seed : l'instruction random.seed(0) permet de garantir la "reproductibilité" des résultats.


In [5]:
import random
random.seed(0)
simulation_boursiere(100, 5, 10 )


Cours semaine 0 : 105.34681237564352
Cours semaine 1 : 115.73138361821448
Cours semaine 2 : 121.08482256990295
Cours semaine 3 : 124.42344691023956
Cours semaine 4 : 115.73450285503783

Exemple n°2 : cette cellule doit afficher :

Cours semaine 0 : 32.07693325674235  
Cours semaine 1 : 18.53044918097587  
Cours semaine 2 : 17.872444811843824  
Cours semaine 3 : 12.672627612782238
Cours semaine 4 : 17.60190600299601
Cours semaine 5 : 14.681739640999766
Cours semaine 6 : 33.99446314175473
Cours semaine 7 : 22.772097693761907
Cours semaine 8 : 0
Cours semaine 9 : 9.272486028487437

A noter le random.seed(7) qui permet de garantir la reproductabilité des résultats, même avec une génération de variable aléatoire


In [6]:
import random
random.seed(7)
simulation_boursiere(50, 10, 20 )


Cours semaine 0 : 32.07693325674235
Cours semaine 1 : 18.53044918097587
Cours semaine 2 : 17.872444811843824
Cours semaine 3 : 12.672627612782238
Cours semaine 4 : 17.60190600299601
Cours semaine 5 : 14.681739640999766
Cours semaine 6 : 33.99446314175473
Cours semaine 7 : 22.772097693761907
Cours semaine 8 : 0
Cours semaine 9 : 9.272486028487437

Exercice n°3


In [7]:
def f(y0,vy0,tm,dt):
    g = 9.8
    cf_air = 0.001
    t = 0
    vy = vy0
    y = 0
    while t <= tm:
        vy = vy - g*dt
        if vy > 0:
            vy = vy - cf_air*vy**2*dt
        else:
            vy = vy + cf_air*vy**2*dt
        y = y + vy*dt
        if y < 0:
            y = 0
            vy = -vy
        
        ## int est la conversion en entier
        ## pour un nombre à virgule flottante, c'est arrondi par défaut
        if int(t) != int(t+dt):
            print("t: {0:>3.0f}, vy: {1:>7.2f}, y: {2:>7.2f}, e: {3:>7.1f} ".format(t+dt, vy,y,0.5*vy**2 + g*y)) 
        t = t + dt

Exemple n°1 : cette cellule doit afficher :

t:   1, vy:   81.93, y:   89.77, e:  4235.7 
t:   2, vy:   68.08, y:  156.44, e:  3850.4 
t:   3, vy:   54.56, y:  216.94, e:  3614.3 
t:   4, vy:   42.44, y:  264.74, e:  3494.9 
t:   5, vy:   30.23, y:  304.01, e:  3436.3 
t:   6, vy:   19.82, y:  328.47, e:  3415.5 
t:   7, vy:    9.81, y:  342.76, e:  3407.2 
t:   8, vy:   -0.02, y:  347.16, e:  3402.2 
t:   9, vy:   -9.78, y:  341.76, e:  3397.1 
t:  10, vy:  -19.35, y:  326.70, e:  3388.8

In [9]:
f(200,-100,10,0.1)


t:   1, vy:   81.93, y:   89.77, e:  4235.7 
t:   2, vy:   68.08, y:  156.44, e:  3850.4 
t:   3, vy:   54.56, y:  216.94, e:  3614.3 
t:   4, vy:   42.44, y:  264.74, e:  3494.9 
t:   5, vy:   30.23, y:  304.01, e:  3436.3 
t:   6, vy:   19.82, y:  328.47, e:  3415.5 
t:   7, vy:    9.81, y:  342.76, e:  3407.2 
t:   8, vy:   -0.02, y:  347.16, e:  3402.2 
t:   9, vy:   -9.78, y:  341.76, e:  3397.1 
t:  10, vy:  -19.35, y:  326.70, e:  3388.8 

Notez bien : Le Pur Hazard, ne se trouve pas purement par hazard


In [ ]: