Programmer en Python en 2nde

Boucle while : Exercices

Moyenne de nombres saisis au clavier

Écrire un script Python qui respecte la spécification suivante :

Saisie Des notes (nombres entre 0 et 20) saisies au clavier
Affichage La moyenne des notes entrées

Dans ce programme, on pourra considèrer que l'utilisateur ne fait pas d'erreur de saisie, c'est-à-dire qu'il saisit effectivement des valeurs comprises entre 0 et 20.

  • Une solution
  • Avec contrôle des saisies Plus tard !

'\n' signifie newline. Il est utilisé ci-dessous pour laisser une ligne vide. On pourrait aussi utiliser l'instruction print() seule pour obtenir le même effet.


print("Saisir les notes dont la moyenne doit être calculée.")
print("Saisir -1 pour terminer.\n")

# variable enregistrant les différents nombres saisis au clavier :
saisie = 0
# compteur du nombre de valeurs numériques saisies :
numero = 0
# variable sommmant les valeurs saisies :
somme = 0

while saisie != -1 :
    # nouvelle entrée-clavier :
    saisie = float(input("Saisir la note numéro {} : ".format(numero+1)))
    if saisie != -1 :		# si cette saisie est distincte de -1, 
        numero += 1			# numero est incrémenté  
        somme += saisie		# et la nouvelle note est ajoutée à somme
		
moyenne = somme/numero
print("\nLa moyenne des notes saisies au clavier est égale à {}.".format(moyenne))

On contrôle ici que l'utilisateur entre bien des valeurs numériques comprises entre 0 et 20.



def est_note(x) :
    return 0 <= x <= 20
	
	

def est_nombre(x) :
    try:
        float(x)
        return True
    except ValueError:
        return False
		
		
		
def saisir(numero_note):
    saisie =  input("Saisir la note numéro {} : ".format(numero_note)) 
    while not est_nombre(saisie)  :
        saisie =  input("Saisir la note numéro {} : ".format(numero_note)) 
    return float(saisie)



print("Saisir les notes dont la moyenne doit être calculée.")
print("Saisir -1 pour terminer.\n")

# variable enregistrant les différents nombres saisis au clavier :
saisie = 0
# compteur du nombre de valeurs numériques saisies :
numero = 0
# variable sommmant les valeurs saisies :
somme = 0

while saisie != -1 :
    # nouvelle entrée-clavier :
    saisie = saisir(numero+1)
	
    if est_note(saisie) and saisie != -1 :		# si cette saisie est distincte de -1 et est bien entre 0 et 20, 
        numero += 1			# numero est incrémenté  
        somme += saisie		# et la nouvelle note est ajoutée à somme
		
moyenne = somme/numero
print("\nLa moyenne des notes saisies au clavier est égale à {}.".format(moyenne))

Une variante :


def est_note(x) :
    return 0 <= x <= 20
	
	

def est_nombre(x) :
    try:
        float(x)
        return True
    except ValueError:
        return False
		
		
		
def saisir(numero_note):
    saisie =  input("Saisir la note numéro {} : ".format(numero_note)) 
    while not est_nombre(saisie)  :
        saisie =  input("Saisir la note numéro {} : ".format(numero_note)) 
    return float(saisie)



print("Saisir les notes dont la moyenne doit être calculée.")
print("Saisir -1 pour terminer.\n")

# variable enregistrant les différents nombres saisis au clavier :
saisie = 0
# compteur du nombre de valeurs numériques saisies :
numero = 0
# variable sommmant les valeurs saisies :
somme = 0

while "L'utilisateur entre une nouvelle note" : # boucle infinie
	
    saisie = saisir(numero+1) # nouvelle saisie-clavier 
	
    if saisie == -1 :
        break # on sort de la boucle avec  la saisie -1
    elif est_note(saisie) :		# si la saisie est  une note
        numero += 1			# numero est incrémenté  
        somme += saisie		# et la nouvelle note est ajoutée à somme
		
moyenne = somme/numero
print("\nLa moyenne des notes saisies au clavier est égale à {}.".format(moyenne))

Remarque

En classes de lycée, Lorsque les contraintes sont spécifiées dans le cahier des charges (nombres entre 0 et 20), on pourra considérer que l'utilisateur est intelligent et qu'il respecte le cahier des charges lors de l'appel à la fonction correspondante.

Temps d'attente

On lance un dé équilibré à six faces numérotées de 1 à 6.

  1. Écrire une fonction en Python qui respecte la spécification suivante :

    Paramètres /
    Valeur renvoyée le nombre de lancers effectués pour obtenir 6.
  2. Écrire un script qui utilise cette fonction \(10 000\) fois et calcule le temps d'attente moyen du 6 pour cet échantillon de taille \(10 000\).
  • Temps d'attente du 6
  • Moyenne

On importe la fonction randint() du module random afin de générer un entier aléatoire compris entre 1 et 6.


			
			

from random import randint

def je_veux_un_six() :
    de = randint(1,6)
    compteur = 1
    while de != 6 :
        de = randint(1,6)
        compteur += 1
    return compteur
	
	
s = 0
for _ in range(10000) :
    s += je_veux_un_six()
	
print("Temps d'attente moyen sur nos 10 000 essais : ", s/10000)

Polynôme et nombres premiers

Leonhard considère le polynôme suivant : \( f(n) = n^2 + n + 41 \). Il calcule les images des 15 premiers entiers 0, 1, 2, 3, ... et constate qu'ils sont premiers.

Écrire un programme en Python qui détermine le plus petit entier \(n\) tel que \( f(n) \) ne soit pas premier.

  • Une solution

La fonction floor() du module math renvoie la partie entière du nombre donné en argument.


from math import floor, sqrt

def f(n):
    return n**2+n+41
	
def est_premier(n):
    if n < 2 : return False
    for k in range(2, floor(sqrt(n))+1 ) :
        if n % k == 0 : return False
    return True
	
	
k = 0
while est_premier(f(k)) :
    k += 1
print(k)

Mini exerciseur

Écrire un programme qui suit les indications suivantes :

  • Les coordonnées (entières) d'un vecteur \( \overrightarrow{u} \) sont tirées au hasard.
  • L'abscisse d'un vecteur \( \overrightarrow{v} \) est choisie au hasard parmi les multiples de l'abscisse de \( \overrightarrow{u} \).
  • Le programme demande à l'élève de donner l'ordonnée de \( \overrightarrow{v} \) sachant que \( \overrightarrow{v} \) est colinéaire à \( \overrightarrow{u} \).
  • Le programme demande à l'élève de recommencer jusqu'à ce que sa réponse soit correcte.
  • Commentaire
  • Un code possible
  • Une variante Plus tard !

Cet exercice peut être envisagé comme un mini-projet à faire réaliser. En plus de programmer pas à pas cet exerciseur, l'élève pourra ensuite s'en servir pour s'exercer sur un domaine particulier des mathématiques. L'idée est qu'en ayant en projet de programmer son propre "entraîneur", l'effort nécessaire de formalisation paraisse moins arbitraire à l'élève.



from random import randint


ux = randint(1, 100)
uy = randint(1, 100)

vx = randint(1,10) * ux

print("Le vecteur u a pour coordonnées ({}; {}).".format(ux, uy))
print("Le vecteur v a pour abscisse {} et est colinéaire au vecteur u.".format(vx))
print("Quelle est l'ordonnée de v ?")

bonne_reponse = False

while not(bonne_reponse) :
    vy = int( input("Entre ta réponse : " ) )
    if ux * vy == uy * vx :
        bonne_reponse = True
        print("Bravo !")
    else :
        print("Essaie encore !")

Dans le langage Python, toute chaîne non vide est considérée comme ayant la valeur True lorsque cette chaîne est utilisée dans un test. Ce qui permet la variante suivante, plus proche encore d'un exposé de l'algorithme en langage naturel :



from random import randint


ux = randint(1, 100)
uy = randint(1, 100)

vx = randint(1,10) * ux

print("Le vecteur u a pour coordonnées ({}; {}).".format(ux,uy))
print("Le vecteur v a pour abscisse {} et est colinéaire au vecteur u.".format(vx))
print("Quelle est l'ordonnée de v ?")

 

while "la réponse donnée n'est pas correcte ":
    vy = int( input("Entre ta réponse : " ) )
    if ux * vy == uy * vx :
        print("Bravo !")
        break						# Permet de sortir de la boucle
    else :
        print("Essaie encore !")