Python en mathématiques - Niveau 1

Boucle while : Exercices supplémentaires

Plus tard ! Les exercices de cette page peuvent (doivent) être réservés à une seconde lecture.

De plus, certains exercices utilisent un affichage ou une saisie par l'utilisateur dans leurs spécifications. Ils sont bien évidemment hors programme de lycée et ils n'ont d'autres but que de vous exercer à programmer.

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. Les saisies s'arrêtent quand l'utilisateur entre la valeur -1
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.

  • Remarque
  • Une solution
  • Avec contrôle des saisies
'\n' signifie newline. Il est utilisé dans les scripts proposés 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 = 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.


##----- Définition des Fonctions -----##
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)


##----- Programme principal et interaction -----##
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 = 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 :


##----- Définition des Fonctions -----##
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)


##----- Programme principal et interaction -----##
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 = 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.

Fonction mystère

On considère le programme Python suivant :


def f(x):
    return x**2 - 5*x + 6
	

def g(pas, borne_inf, borne_sup) :
    x = borne_inf
    mini = f(x)
    x_mini = x
	
    while x <= borne_sup : 
        if f(x) < mini :
            x_mini = x
            mini =  f(x)
        x = x + pas 
		
    return x_mini
>>> g(0.1, -10, 10)
 
  1. Quelle valeur sera renvoyée par l'appel ci-dessus ?
  2. Quel rôle peut jouer la fonction g ?
  • Question 1°/
  • Question 2°/
  • Prolongement

On obtient :

>>> g(0.1, -10, 10)
2.4999999999999822
 

Parmi les abscisses borne_inf, borne_inf+pas, borne_inf+2*pas, borne_inf+3*pas, ..., inférieures au égales à borne_sup, la fonction g sélectionne celle qui correspond à une image minimale par f.

Pour des fonctions connues (comme les fonctions du second degré), la fonction g permet de donner une valeur approchée à pas près de l'abscisse en laquelle f admet un minimum (sur [borne_inf; borne_sup]).

En Python, une fonction est un objet comme un autre et peut donc être un paramètre de fonction. On peut donc immédiatement réinvestir le travail avec un second trinôme sans modification de code :


def trinome1(x):
    return x**2 - 5*x + 6
	
	
def trinome2(x):
    return x**2 + x - 30
	

def g(f, pas, borne_inf, borne_sup) :
    x = borne_inf
    mini = f(x)
    x_mini = x
	
    while x <= borne_sup : 
        if f(x) < mini :
            x_mini = x
            mini =  f(x)
        x = x + pas 
		
    return x_mini
>>> g(trinome1, 0.1, -10, 10 )
2.4999999999999822

>>> g(trinome2, 0.1, -10, 10 )
-0.5000000000000188
 

Rendu de monnaie

Écrire une fonction en Python, nommée rendu_de_monnaie(), qui respecte les spécifications suivantes :

Paramètres un entier naturel non nul (somme à payer)
un entier naturel non nul (somme versée par le client)
Valeur renvoyée un triplet contenant le nombre de pièces de 10 euros, de pièces de 5 euros et de pièces de 1 euro à rendre sachant que l'on commence par rendre le plus de pièces de 10 possible, puis le plus de pièces de 5 possible et enfin le reste en pièces de 1.

Tester ensuite cette fonction avec une somme à payer de 43 euros et un versement de 100 euros.

  • Une piste
  • Un code possible
  • Une variante
  • Et avec un peu de maths élémentaires
Le triplet renvoyé par la fonction sera écrit sous la forme d'un tuple : les trois valeurs séparées par une virgule.

		
		

		
		

		
		

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

		
		

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 :


		
		

Mini exerciseur 2

  1. Écrire une fonction en Python, nommée pgcd(), qui respecte le cahier des charges suivant :
    Paramètres un entier naturel a et un entier naturel b (non tous deux nuls)
    Valeur renvoyée pgcd(a; b)
  2. Écrire un programme (exerciseur) qui suit les indications suivantes :
    • Un rationnel (positif) est choisi au hasard.
    • On demande à l'utilisateur d'entrer le numérateur et le dénominateur de la fraction irréductible correspondante.
    • Le programme demande à l'utilisateur de recommencer jusqu'à ce qu'il réponde correctement à la question.
  • Commentaire
  • Fonction pgcd()
  • Exerciseur
Comme le Mini exerciseur 1, celui-ci 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.

			
			

Une autre version, qui fait appel à l'affectation parallèle :