C9 Exercices Bilan Python ⚓︎
Exercice 1 freinage ok
Remarque 1 : Vous pouvez (et c'est même à cela que ça sert) réutiliser une fonction dans une autre fonction. Ici il faudra y penser pour la fonction à programmer.
Une voiture roule sur route sèche lorsqu'un obstacle apparait sur la route devant le véhicule, imposant au conducteur de freiner pour s'arrêter.
Entre le moment où l'obstacle est apparu et le moment où la voiture s'arrête une certaine distance \(d_{arret}\) a été parcourue (appelée distance totale d'arrêt). Cette distance \(d_{arret}\) dépend de la vitesse initiale du véhicule : plus le véhicule roule vite et plus la distance \(d_{arret}\) est grande. Plus précisément la distance totale d'arrêt est renvoyée par la fonction suivante distance_totale_arret
où :
- v
est donnée en kilomètres par heure,
- la valeur renvoyée correspond à la distance totale d'arrêt \(d_{arret}\) en mètres.
def distance_totale_arret(v):
assert v >= 0
d = 0.3*v + 0.005*v**2
return d
Par exemple l'appel de fonction ci-dessous nous indique qu'à une vitesse de 120 km par heure sur route sèche, la distance totale d'arrêt est de 108 mètres.
distance_totale_arret(120)
Compléter la fonction freinage_ok
qui prend en paramètres deux nombres :
- une vitesse
v
correspondant à la vitesse du véhicule sur route sèche au moment où apparait l'obstacle, - un entier
distance_obstacle
désignant la distance à laquelle est apparu l'obstacle.
Cette fonction doit renvoyer True
si le véhicule a le temps de s'arrêter avant l'obstacle et doit renvoyer False
si le véhicule n'a pas le temps de s'arrêter avant l'obstacle.
def freinage_ok(v, distance_obstacle):
d = 0.3*v + 0.005*v**2
if d < distance_obstacle:
return True
else:
return False
freinage_ok(135,140)
True
Vérifier que votre fonction satisfait le jeu de tests suivant.
assert freinage_ok(20, 250)
assert not freinage_ok(190, 40)
assert not freinage_ok(20, 5)
assert freinage_ok(30, 48)
assert freinage_ok(40, 30)
assert not freinage_ok(60, 30)
assert freinage_ok(80, 60)
Un véhicule roule à 70 kilomètres par heure sur une route sèche. En utilisant votre fonction, déterminer si le véhicule a le temps de s'arrêter lorsqu'un obstacle apparait à 46 mètres.
freinage_ok(70,46)
Exercice 2 réussir l'examen
Dans tout ce qui suit les notes sont sur 20 points.
Voici un exemple de calcul de moyenne avec des coefficients :
- DS : 13 coefficient 2
- Evaluation : 18 coefficient 1
- TP : 16 coefficient 0.5
La moyenne est obtenue en faisant(2*13 + 1*18 + 0.5*16)/(2+1+0.5)
Un examen comporte 6 épreuves :
- Français coefficient 4,
- Anglais coefficient 3,
- Philosophie coefficient 1,
- Mathématiques coefficient 4,
- Physique coefficient 2,
- Informatique coefficient 6.
Un·e étudiant·e peut être admis·e de deux façons :
- si sa moyenne littéraire est supérieure ou égale à 11 et sa moyenne scientifique est supérieure ou égale à 11,
- ou bien si sa moyenne scientifique est supérieure ou égale à 16.
Programmer la fonction reussir_examen
qui prend les six notes des épreuves comme paramètres (fra, ang, phi, mat, phy
et inf
) et qui renvoie True
ou False
selon que l'étudiant·e est admis·e ou pas.
def reussir_examen(fra, ang, phi, mat, phy, inf):
moyenne_litt = (4*fra + 3*ang + 1*phi)/(4+3+1)
moyenne_sci = (4*mat + 2*phy + 6*inf)/(4+2+6)
if moyenne_litt>=11 and moyenne_sci>=11:
return True
elif moyenne_sci>=16:
return True
else:
return False
reussir_examen(17,12,9,19,2,11)
Tester votre fonction grâce au jeu de tests ci-dessous :
assert reussir_examen(10, 13, 11, 15, 6, 12)
assert not reussir_examen(8, 13, 11, 15, 6, 12)
assert not reussir_examen(10, 13, 11, 11, 6, 12)
assert reussir_examen(6, 3, 11, 15, 16, 20)
En utilisant votre fonction déterminer si un·e étudiant·e ayant eu les notes suivantes (dans l'ordre des matières ci-dessus) : 8, 11, 14, 13, 9, 11 est admis·e ou pas.
reussir_examen(8,11,14,13,9,11)
False
Exercice 3 ballon ficelle
Dans une fête foraine un jeu de hasard consiste pour le joueur à réussir à crever un ballon parmi de nombreux ballons qui sont accrochés au plafond du stand grâce à des ficelles mesurant entre 30 centimètres et 99 centimètres.
Une fois crevé, le forain récupère la ficelle du ballon et l'enroule autour d'une bobine de périmètre 10 centimètres fixée sur le comptoir du stand.
En fonction de la longueur, il arrive à faire un certain nombre de tours avec la ficelle. Par exemple avec une ficelle de 68 centimètres, il arrive à faire 6 tours de ficelle plus un morceau de 8 centimètres qui dépasse.
- Le joueur gagne 20 points si le nombre de tours de ficelle est égal au nombre de centimètres de ficelle qui dépassent,
- sinon il gagne 10 points si le nombre de centimètres de ficelle qui dépassent est supérieur ou égal à 7,
- sinon il gagne 5 points si le nombre de tours de ficelle est pair,
- sinon il ne gagne aucun point.
En faisant plusieurs lancers, le joueur cumule des points avec lesquels il peut s'offrir un lot.
Compléter la fonction score
ci-dessous qui prend en argument un nombre entier l
correspondant à la longueur de la ficelle et qui renvoie le nombre de points nb_points
gagnés par le joueur.
def score(lg):
nb_tours = lg // 10
longueur_qui_depasse = lg % 10
if nb_tours == longueur_qui_depasse:
nbpoints= 20
elif longueur_qui_depasse>=7:
nbpoints= 10
elif nb_tours % 2 == 0:
nbpoints= 5
else:
nbpoints=0
return nbpoints
def score(lg):
nb_tours = lg // 10
longueur_qui_depasse = lg % 10
nb_points = 0
if nb_tours == longueur_qui_depasse:
return 20
elif longueur_qui_depasse>=7:
return 10
elif nb_tours % 2 == 0:
return 5
else:
return nb_points
Vérifier que votre fonction satisfait le jeu de tests suivant :
assert score(55) == 20
assert score(33) == 20
assert score(57) == 10
assert score(49) == 10
assert score(88) == 20
assert score(43) == 5
assert score(85) == 5
assert score(56) == 0
assert score(34) == 0
En utilisant votre fonction, déterminer le nombre de points lorsque la ficelle mesure 64 centimètres.
score(64)
5
Exercice 4 annee bissextile
D'après Wikipédia :
«Depuis l'ajustement du calendrier grégorien, l'année n’est bissextile (comportant 366 jours) que dans l’un des deux cas suivants :
- si l'année est divisible par 4 et non divisible par 100 ;
- si l'année est divisible par 400 (« divisible » signifie que la division donne un nombre entier, sans reste).
- Sinon, l'année n'est pas bissextile : elle a la durée habituelle de 365 jours (elle est dite année commune).
Ainsi, 2021 n'est pas bissextile. L'an 2008 était bissextil suivant la première règle (divisible par 4 et non divisible par 100). L'an 1900 n'était pas bissextil car divisible par 4, mais aussi par 100 (première règle non respectée) et non divisible par 400 (seconde règle non respectée). L'an 2000 était bissextil car divisible par 400.»
Programmer la fonction annee_bissextile
qui prend en paramètre un nombre entier correspondant à une année a
et renvoie True
si l'année correspondant est bissextile (et False
sinon).
def annee_bissextile(a):
if a % 4 == 0 and a % 100 != 0:
return True
elif a % 400 ==0:
return True
else:
return False
Tester votre fonction grâce au jeu de tests ci-dessous :
assert annee_bissextile(2008)
assert not annee_bissextile(1900)
assert not annee_bissextile(2021)
assert annee_bissextile(2028)
assert annee_bissextile(2400)
assert not annee_bissextile(2100)
En utilisant votre fonction déterminer si 1792 est une année bissextile.
annee_bissextile(1792)
True
rogrammer ci-dessous la fonction nb_jours
qui prend en argument une année a >= 1583
et renvoie le nombre de jours de cette année (365
ou 366
).
Cette fonction nb_jours
réutilisera la fonction annee_bissextile
.
def nb_jours(a):
assert a >= 1583
nb_jours = 0
for i in range(a):
if annee_bissextile(a) == True:
nb_jours = 366
else:
nb_jours = 365
return nb_jours
En utilisant votre fonction déterminer combien de jours comportait l'année 1594 et combien de jours comportait l'année 1748.
print(nb_jours(1594))
print(nb_jours(1748))
365
366
Exercice 5 nombre de bits
On sait que sur k
bits on peut coder 2**k
mots différents. Par exemple sur k = 10
bits on peut coder 2**10 = 1024
mots différents.
Un exemple classique est le codage ASCII sur k = 7
bits qui permet de représenter n = 2**7 = 128
«objets» (à savoir des caractères alphabétiques et numériques plus quelques autres symboles ou codes spéciaux).
Mais si l'on souhaite coder n
éléments différents, peut-on déterminer le nombre k
de bits nécessaires ?
Par exemple si l'on souhaite coder n = 3 789 147
caractères, combien de bits sont nécessaires ?
Compléter la fonction nombre_de_bits
ci-dessous qui prend en paramètre un nombre n >= 2
d'éléments à coder et renvoie le nombre k
de bits nécessaires pour y parvenir.
Pour cela on teste différentes valeurs de 2**k
(en augmentant k
de un en un) jusqu'à dépasser la valeur n
fournie.
def nombre_de_bits(n):
k = 0
while 2**k < n:
k += 1
return k
nombre_de_bits(1025)
11
Tester votre fonction en utilisant le jeu de tests ci-dessous.
from math import log, ceil, floor
for n in [2, 3, 4, 5, 6, 7, 8, 15, 16, 17, 1024, 1025, 2**57 - 1, 2**57]:
assert nombre_de_bits(n) == (n-1).bit_length()
Exercice 6 Millionnaire
Depuis ses huit ans, Super-avare économise des klipoks (monnaie locale).
Le jour de ses huit ans il avait 8**3 = 512
klipoks dans sa tirelire.
Le jour de ses neuf ans il avait 512 + 9**3 = 1241
klipoks dans sa tirelire.
Le jour de ses dix ans il avait 1241 + 10**3 = 2241
klipoks dans sa tirelire.
Le jour de ses onze ans il avait 2241 + 11**3 = 3572
klipoks dans sa tirelire.
Compléter la fonction calculer_tirelire
qui prend en paramètre un entier n
supérieur ou égal à 8 et renvoie le nombre entier correspondant au nombre de klipocks que Super-avare a dans sa tirelire le jour de son n-ième anniversaire.
Remarque : on est ici en présence d'un algorithme d'accumulation (l'accumulateur est tirelire
).
def calculer_tirelire(n):
somme = 0
for age in range(8, n+1):
somme += age**3
return somme
calculer_tirelire(45)
1070441
Tester votre fonction en utilisant le jeu de tests ci-dessous.
assert calculer_tirelire(8) == 512
assert calculer_tirelire(9) == 1241
assert calculer_tirelire(10) == 2241
assert calculer_tirelire(11) == 3572
assert calculer_tirelire(18) == 28457
assert calculer_tirelire(75) == 8121716
Compléter la fonction age_millionnaire
afin qu'elle renvoie l'âge à partir duquel Super-avare devient millionnaire (ici on ne cherchera pas à réutiliser la fonction calculer_tirelire
).
def age_millionnaire():
tirelire = 0
age = 0
while tirelire < 1000000 :
tirelire += age**3
age += 1
return age-1
age_millionnaire()
45
Exercice 7 Kangourou
Un kangourou se déplace en ligne droite en faisant des bonds dont la longueur est aléatoire. On modélise la longueur d'un bond en utilisant la fonction randint(2, 13)
du module random
qui renvoie un nombre entier aléatoire compris entre 2 et 13.
Compléter la fonction distance_totale(n)
ci-dessous qui prend en paramètres un nombre n
de sauts et renvoie la distance totale parcourue par le kangourou lors de n
sauts aléatoires.
Remarque : on est ici en présence d'un algorithme d'accumulation (l'accumulateur est total
).
from random import randint
def distance_totale(n):
total = 0
for _ in range(n):
longueur_saut = randint(2, 13)
total += longueur_saut
return total
Effectuer plusieurs appels à cette fonction pour voir quelle distance parcourt approximativement le kangourou en faisant 10 sauts :
moyenne = 0
for i in range(10000):
distance = distance_totale(10)
moyenne += distance
moyenne = moyenne / 10000
print(moyenne)
75.0162
On souhaite désormais savoir combien de sauts aléatoires va faire le kangourou pour parcourir 100 mètres. Compléter la fonction nb_sauts_100_metres
ci-dessous afin qu'elle renvoie le nombre de sauts nécessaires pour que le kangourou fasse 100 mètres (le résultat renvoyé sera aléatoire et dépendra des appels de fonction).
from random import randint
def nb_sauts_100_metres():
total = 0
nb_sauts = 0
while total < 100 :
longueur_saut = randint(2, 13)
total += longueur_saut
nb_sauts += 1
return nb_sauts
nb_sauts_100_metres()
12
Effectuer des appels de fonctions pour vérifier si les résultats fournis sont vraisemblables :
for _ in range(50):
print(nb_sauts_100_metres())