Python

La boucle Tant Que ...
Exercices pour débuter

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.

  • Piste ?
  • Solution ?
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
					

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