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))