Partie 4 · Algorithmique et programmation · Chapitre 21
Écrire des programmes simples
Variables, boucles, fonctions.
Le chapitre précédent a donné le vocabulaire. Celui-ci apprend à s’en servir pour construire les trois programmes qui reviennent dans tous les sujets : accumuler une somme, chercher un seuil, et fabriquer une fonction que l’on pourra appeler avec n’importe quelle valeur.
La boucle bornée
Définition : Boucle for
La boucle répète un bloc d’instructions un nombre de fois connu à l’avance. À chaque tour, la variable de boucle prend la valeur suivante de la séquence parcourue.
for i in range(4): print(i)Ce que le programme affiche
0
1
2
3Remarque : la variable de boucle existe après la boucle
À la sortie de la boucle, conserve sa dernière valeur, ici . On évite toutefois de s’en servir : un programme lisible ne réutilise pas une variable de boucle en dehors de sa boucle.
$\texttt{range}$ en détail
C’est la source d’erreur numéro un des sujets de baccalauréat. La règle tient en une phrase : la borne de gauche est incluse, celle de droite est exclue.
| Écriture | Valeurs parcourues | Nombre de tours |
|---|---|---|
Méthode : traduire un intervalle d’entiers
- « pour allant de à » s’écrit : sans le , on s’arrête à .
- « répétitions » s’écrit , sans se préoccuper des valeurs prises.
- Pour descendre, le troisième argument est le pas, ici négatif.
Exemple
for i in range(5, 0, -1): print(i)Ce que le programme affiche
5
4
3
2
1Accumuler dans une variable
Le même schéma sert à calculer une somme, un produit ou un effectif : on prépare une variable avant la boucle, puis on la met à jour à chaque tour.
Méthode : le schéma d’accumulation
- Initialiser avant la boucle : pour une somme, pour un produit, pour un compteur.
- Mettre à jour dans la boucle, par une affectation du type .
- Utiliser le résultat après la boucle, une fois tous les tours faits.
L’initialisation doit se trouver avant la boucle. Placée dedans, elle remettrait le total à zéro à chaque tour.
Exemple : une somme
Calcul de :
s = 0for k in range(1, 11): s = s + kprint(s)Ce que le programme affiche
55Exemple : un produit
Calcul de , la factorielle rencontrée au chapitre du dénombrement :
p = 1for k in range(1, 6): p = p * kprint(p)Ce que le programme affiche
120Un produit s’initialise à , jamais à : sinon tout le calcul resterait nul.
Exemple : un compteur
Combien y a-t-il de multiples de entre et ?
compteur = 0for k in range(1, 101): if k % 7 == 0: compteur = compteur + 1print(compteur)Ce que le programme affiche
14On retrouve bien , puisque les multiples cherchés vont de à .
Chercher un seuil
Quand le nombre de tours dépend du résultat, la boucle bornée ne convient plus : on ne peut pas écrire dans le un nombre que l’on cherche justement à déterminer.
Méthode : le schéma de recherche de seuil
- Initialiser le terme au premier de la suite, et le compteur de rang à .
- Écrire la condition de poursuite, c’est-à-dire la négation de ce que l’on cherche.
- Dans le corps, calculer le terme suivant puis incrémenter le rang.
- Après la boucle, le compteur contient le premier rang qui vérifie la condition cherchée.
Exemple
Cherchons le plus petit entier tel que . On part de et on multiplie par à chaque tour :
u = 1n = 0while u <= 1000: u = 3 * u n = n + 1print(n, u)Ce que le programme affiche
7 2187Le programme affiche et : en effet alors que .
Exemple
Pour la suite représentée ci-dessus, on cherche le premier rang où elle passe sous :
u = 10n = 0while u >= 3: u = 0.7 * u n = n + 1print(n)Ce que le programme affiche
4Remarque : poursuite ou arrêt
La condition écrite après est celle qui fait continuer, pas celle que l’on cherche. Pour trouver le premier terme strictement inférieur à , on écrit donc , c’est-à-dire la négation de . Se tromper de sens est l’erreur la plus fréquente de ce type d’exercice.
Écrire une fonction
Définition : Fonction
Une fonction est un bloc d’instructions nommé, que l’on peut exécuter autant de fois qu’on veut avec des valeurs différentes. On la définit par , on lui donne des paramètres, et elle renvoie un résultat par .
def carre(x): return x * xprint(carre(3))print(carre(-5))Ce que le programme affiche
9
25Méthode : anatomie d’une fonction
- suivi du nom, des paramètres entre parenthèses, et d’un deux-points.
- Le corps est indenté, comme tout bloc.
- renvoie le résultat et termine immédiatement la fonction : les lignes suivantes ne sont pas exécutées.
- L’appel s’écrit : la valeur , appelée argument, est rangée dans le paramètre .
Exemple
Une fonction peut contenir une boucle. Celle-ci calcule pour n’importe quel :
def somme_carres(n): s = 0 for k in range(1, n + 1): s = s + k * k return sprint(somme_carres(10))Ce que le programme affiche
385Le même programme écrit sans fonction ne servirait qu’une fois, pour la seule valeur .
$\texttt{return}$ n’est pas $\texttt{print}$
C’est la confusion la plus coûteuse du chapitre, car le programme semble marcher : quelque chose s’affiche bien à l’écran.
Propriété : Deux rôles à ne pas confondre
- affiche une valeur pour l’utilisateur. Le programme, lui, n’en récupère rien.
- renvoie une valeur au programme, qui peut la stocker, la réutiliser ou la recalculer.
- Une fonction sans renvoie la valeur spéciale , qui signifie « rien ».
Exemple
def double_affiche(x): print(2 * x)def double_renvoie(x): return 2 * xa = double_affiche(5)b = double_renvoie(5)print(a, b)Ce que le programme affiche
10
None 10La première fonction affiche , mais ne renvoie rien : vaut . La seconde n’affiche rien, mais vaut et pourra servir dans un calcul. Dès qu’un résultat doit être réutilisé, il faut un .
Application aux suites
Voici l’usage le plus fréquent au baccalauréat : une suite définie par récurrence, dont on veut un terme quelconque ou un rang de dépassement.
Exemple : calculer un terme
Pour la suite définie par et , on part du premier terme et on applique fois la relation :
def terme(n): u = 50 for i in range(n): u = 0.8 * u + 1 return uprint(terme(1))print(round(terme(2), 3))Ce que le programme affiche
41.0
33.8La boucle tourne exactement fois, ce qui fait passer de à . Pour , elle ne tourne pas et la fonction renvoie bien .
Exemple : trouver un rang
Avec un paramètre, la même idée donne le rang de franchissement pour n’importe quel seuil :
def seuil(limite): u = 50 n = 0 while u >= limite: u = 0.8 * u + 1 n = n + 1 return nprint(seuil(10))print(seuil(6))Ce que le programme affiche
10
18Plus le seuil est proche de la limite de la suite, ici , plus il faut de termes pour l’atteindre.
Remarque : les décimaux ne sont pas exacts
print(0.1 + 0.2)Ce que le programme affiche
0.30000000000000004La machine ne stocke qu’une valeur approchée des nombres décimaux. Deux conséquences : on affiche les résultats avec , et l’on ne teste jamais l’égalité de deux décimaux par . Pour les entiers, en revanche, Python est exact, quelle que soit leur taille.
Erreurs classiques à éviter
Écrire pour aller de à .
La borne de droite est exclue : il faut . Sinon le dernier terme manque, et la somme est fausse d’exactement .
Initialiser l’accumulateur à l’intérieur de la boucle.
doit être avant la boucle. Placée dedans, cette ligne remet le total à zéro à chaque tour, et le résultat final est le dernier terme seul.
Initialiser un produit à .
Un produit s’initialise à , élément neutre de la multiplication. À partir de , tout produit reste nul.
Écrire dans le la condition d’arrêt au lieu de celle de poursuite.
Après figure la condition qui fait continuer. Pour trouver le premier terme inférieur à , on écrit , la négation de ce que l’on cherche.
Confondre et .
affiche pour l’utilisateur, renvoie au programme. Une fonction sans renvoie , et son résultat est inutilisable dans un calcul.
Placer des instructions après le .
termine la fonction sur-le-champ. Toute ligne écrite après, au même niveau d’indentation, ne sera jamais exécutée.
Oublier d’appeler la fonction.
Définir une fonction n’exécute rien : ne fait que la mémoriser. Il faut ensuite l’appeler, par exemple .
Tester l’égalité de deux nombres décimaux.
Les décimaux sont stockés de façon approchée : est faux en Python. On compare avec ou , ou l’on arrondit avant.
Et maintenant
Le cours est lu ? Vérifie qu’il est acquis : le QCM repère les trous, les exercices confirment en conditions réelles, les flashcards ancrent les formules.