Valeurs aléatoires
Dans certains exercices, il faudra faire appel au module random
.
Voici un rappel d'utilisation de deux fonctions de ce module :
from random import * # Pour accéder aux fonctions du module
a = random() # Nombre décimal aléatoire entre 0 et 1 (exclu)
b = randint(3, 12) # Entier aléatoire entre 3 et 12 inclus
print('La valeur de a est {}'.format(a))
print('La valeur de b est {}'.format(b))
Le programme retourne l'affichage suivant :
La valeur de a est 0.6647246618279405
La valeur de b est 10
Un autre affichage possible :
La valeur de a est 0.14754908447931014
La valeur de b est 7
Écrire un programme, avec la boucle while
, permettant d’afficher les carrés et les cubes des 20 premiers entiers naturels non nuls.
Utiliser indifféremment une boucle while
ou une boucle for
.
1ère possibilité :
for k in range(1,21,1): #Le 1 en troisième argument est facultatif : il s'agit du pas
print(k,k**2,k**3)
ou bien
k=0
while k<21:
print(k,k*k,k**3)
k+=1
Un capital de 10 000 € est placé au taux annuel de 4 %.
Écrire le code permettant d'afficher au bout de combien d'années le capital va dépasser 14 000 €.
- Piste ?
- Une autre piste ?
- Solution ?
On rappelle qu'une augmentation de 4 % correspond à une multiplication par 1.04
.
On a besoin de 2 variables... capital
et annee
, cette dernière sera à afficher à la fin du programme !
capital = 10000
annee = 0
while capital < 14000:
annee += 1
capital = capital * 1.04 #ou capital *= 1.04
print(annee)
Monopoly
On veut écrire une simulation du jeu de monopoly. Un joueur peut rejouer
s'il fait un double.
Mais attention ! S'il faut trois doubles de suite, il doit aller en prison
(sans passer par la case départ et sans toucher 20 000€).
Le programme à concevoir doit :
- Simuler le lancer aléatoire de deux dés à 6 faces ;
- Afficher la valeur de chaque face ainsi que le nombre de cases à parcourir ;
- Relancer les dés dans le cas d'un double ;
- Recommencer... et envoyer le joueur en prison si'il y a trois doubles de
suite.
Un exemple d'affichage avec envoi en prison :
Les faces sont 5 et 5 : Avancez de 10 cases.
Il y a un double, rejouez.
Les faces sont 2 et 2 : Avancez de 4 cases.
Il y a un double, rejouez.
Les faces sont 6 et 6 : Avancez de 12 cases.
Oups ! Encore un double, allez en prison !
- Une piste ?
- Une autre piste ?
- Une solution insuffisante ?
- Une solution suffisante ?
Il faudrait essayer d'utiliser un maximum de variables.
Et ces variables doivent avoir une dénomination explicite !
Le descriptif du programme à concevoir détaille bien le travail
à réaliser. Prenez le temps de faire un brouillon...
Le programme ci-dessous comporte une erreur de boucle infinie.
Cette erreur est difficile à déceler à cause de la valeur
aléatoire des dés : exécuter plusieurs fois le programme
«au hasard» ne permet pas de tester toutes les
situations possibles.
Aux lignes 6
, 7
, 16
et 17
remplacer l'instruction
randint(1, 6)
par la
valeur 2
.
Que peut-on constater ?
Essayez de corriger cette erreur.
##----- Importation des modules -----##
from random import *
##----- Initialisation des variables -----##
double = 0 # Nombre de doubles
de1 = randint(1, 6)
de2 = randint(1, 6)
##----- Programme principal -----##
print('Les faces sont {0} et {1} : Avancez de {2} cases.'.format(de1, de2, de1 + de2))
while (de1 == de2) and (double < 2):
if double < 2:
print('Il y a un double, rejouez.')
double += 1
de1 = randint(1, 6)
de2 = randint(1, 6)
print('Les faces sont {0} et {1} : Avancez de {2} cases.'.format(de1, de2, de1 + de2))
else:
print('Oups ! Encore un double, allez en prison !')
Ce programme corrige l'erreur décelée lors de la
solution précédente. On peut le tester aux lignes
6
, 7
, 16
et 17
en remplaçant l'instruction
randint(1, 6)
par une même valeur fixée.
##----- Importation des modules -----##
from random import *
##----- Initialisation des variables -----##
double = 0 # Nombre de doubles
de1 = randint(1, 6) # Testez sans
de2 = randint(1, 6)
##----- Programme principal -----##
print('Les faces sont {0} et {1} : Avancez de {2} cases.'.format(de1, de2, de1 + de2))
while (de1 == de2) and (double < 2):
double += 1 # Une seule indentation : on reste dans le while...
if double < 2:
print('Il y a un double, rejouez.')
de1 = randint(1, 6)
de2 = randint(1, 6)
print('Les faces sont {0} et {1} : Avancez de {2} cases.'.format(de1, de2, de1 + de2))
else:
print('Oups ! Encore un double, allez en prison !')
Un algorithme bien connu
Écrire un programme qui résout l'équation du 2nd degré
\(a x^2 + bx + c = 0\).
L'utilisateur entre les valeurs des coefficients a
, b
et c
(en obligeant cet utilisateur à entrer une valeur non nulle
pour a
) et le programme affiche la valeur du discriminant et
les éventuelles solutions (données sous forme approchée).
Dans l'exemple d'affichage ci-dessous, l'utilisateur a entré les valeurs
1
, -3
et 2
.
Resolution de ax^2 + bx + c = 0.
Valeur de a : 1
Valeur de b : -3
Valeur de c : 2
Le discriminant est 1.0.
Il y a deux solutions : 1.0 et 2.0.
Le module math
contient les fonctions usuelles de mathématiques.
Une fois ce module importé, la fonction sqrt()
calcule la racine carrée d'un nombre de type float
.
- Une piste ?
- Un conseil ?
- Une solution ?
- Une meilleure solution ?
Ouvrir son cahier de math de classe de 1ère semble une bonne idée...
Quitte à gérer des exceptions pour a
, autant le faire
aussi pour b
et c
. C'est ce qui a été fait dans la
solution alternative en utilisant des fonctions.
##----- Importation des modules -----##
from math import *
##----- Initialisation du programme et des variables -----##
print('Resolution de ax^2 + bx + c = 0 :')
while True: # Attention, boucle infinie !
try: # a doit être non nul
a = float(input('Valeur de a : '))
if a != 0:
break # On sort s'il n'y a pas d'exception
else:
print('Un nombre non nul, merci !')
except: # Il y a une erreur
print('Un nombre non nul, merci !')
b = float(input('Valeur de b : '))
c = float(input('Valeur de c : '))
##----- Programme de calcul -----##
delta = b**2 - 4*a*c
print('Le discriminant est {}'.format(delta))
if delta < 0:
print("Il n'y a pas de solution.")
elif delta == 0:
print('Il y a une solution : {}.'.format(-b/(2*a)))
else:
x1, x2 = (-b-sqrt(delta))/(2*a), (-b+sqrt(delta))/(2*a)
print('Il y a deux solutions : {0} et {1}.'.format(x1, x2))
Gérer les exceptions à la fois pour a
, b
et c
nécessiterait de recopier plusieurs
fois les mêmes lignes de codes. Utiliser une fonction (que l'on verra dès la semaine prochaine)
permet d'éviter ce type de recopie...
##----- Importation des modules -----##
from math import *
##----- Définition des Fonctions -----##
def test(phrase):
""" Entrees : une chaine de caractere qui sera affichee a l'ecran
Sorties : renvoie d'un nombre de type float """
while True: # Attention, boucle infinie !
try: # On essaie
valeur = float(input(phrase))
break # On sort
except: # Il y a une erreur
print('Un nombre, merci !')
return valeur
##----- Initialisation du programme et des variables -----##
print('Resolution de ax^2 + bx + c = 0 :')
a = test('Valeur de a : ')
while a == 0:
print('Un nombre non nul, merci !')
a = test('Valeur de a : ')
b = test('Valeur de b : ')
c = test('Valeur de c : ')
##----- Programme de calcul -----##
delta = b**2 - 4*a*c
print('Le discriminant est {}'.format(delta))
if delta < 0:
print("Il n'y a pas de solution.")
elif delta == 0:
print('Il y a une solution : {}.'.format(-b/(2*a)))
else:
x1, x2 = (-b-sqrt(delta))/(2*a), (-b+sqrt(delta))/(2*a)
print('Il y a deux solutions : {0} et {1}.'.format(x1, x2))