Algorithmique et Python
Lucas place 1 000 € sur un livret. Chaque année, son capital augmente de 3 %. Au bout de combien d'années aura-t-il atteint 1 200 € ? Calculer à la main année après année est long : il est bien plus efficace de demander à un ordinateur de répéter le calcul. C'est le rôle d'un algorithme, que nous écrirons en Python. À la fin de la page, nous répondrons à la question de Lucas.
Variables et affectation
Une variable est un nom qui désigne une valeur gardée en mémoire. L'instruction a = 5 est une affectation : elle range la valeur 5 dans la variable a. Ce n'est pas une égalité mathématique : à droite du signe =, on calcule d'abord, puis on range le résultat dans la variable de gauche.
Une variable peut contenir un entier (int), un flottant (float, un nombre décimal comme 1.03), un booléen (True ou False) ou une chaîne de caractères ("bonjour"). En Python, la virgule décimale s'écrit avec un point : 1.03 et non 1,03.
Un programme s'exécute ligne par ligne, dans l'ordre : c'est une séquence d'instructions.
On considère le programme Python suivant : Donner les valeurs de $a$ et de $b$ à la fin de l'exécution.
On considère le programme Python suivant :
a = 5
b = 3
a = a + b
b = a - 2 * b
Donner les valeurs de $a$ et de $b$ à la fin de l'exécution.
Fonctions et conditionnelles
Une fonction Python regroupe des instructions sous un nom. Elle reçoit des arguments (les entrées) et renvoie un résultat avec return.
def f(x):
return 2 * x + 1
Alors f(3) renvoie $7$. Attention : l'indentation (le décalage de 4 espaces) fait partie de la syntaxe.
Une instruction conditionnelle exécute un bloc seulement si une condition est vraie :
def valeur_absolue(x):
if x < 0:
return -x
else:
return x
Les tests utilisent <, >, <=, >=, == (égal à), != (différent de). On combine des conditions avec and (« et ») et or (« ou »). Le reste de la division euclidienne de a par b s'obtient avec a % b : 17 % 5 vaut 2, et a % b == 0 signifie que $b$ divise $a$.
On considère la fonction : Calculer f(-3), f(4) et f(0).
On considère la fonction :
def f(x):
if x < 0:
return -x
else:
return x * x
Calculer f(-3), f(4) et f(0).
Écrire en Python une fonction taux(v0, v1) qui renvoie le taux d'évolution, en pourcentage, d'une valeur initiale v0 à une valeur finale v1. Donner ensuite le résultat…
Écrire en Python une fonction taux(v0, v1) qui renvoie le taux d'évolution, en pourcentage, d'une valeur initiale v0 à une valeur finale v1. Donner ensuite le résultat de taux(80, 92) et de taux(50, 40).
La boucle for
Quand on sait combien de fois répéter, on utilise for. L'instruction for i in range(a, b): fait prendre à i les valeurs entières de a à b - 1 : la borne b est exclue.
s = 0
for i in range(1, 4):
s = s + i
Ici i prend les valeurs 1, 2, 3 et s vaut $0+1+2+3 = 6$ à la fin.
| tour | i |
s après le tour |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 3 |
| 3 | 3 | 6 |
On considère le programme : a) Donner les valeurs prises par i. b) Quelle est la valeur de s à la fin ?
On considère le programme :
s = 0
for i in range(1, 5):
s = s + i
- a) Donner les valeurs prises par
i. - b) Quelle est la valeur de
sà la fin ?
On considère la fonction : a) Calculer mystere(12) et mystere(7). b) Que calcule cette fonction ? c) Pour quelles valeurs de n supérieures à 1 la fonction renvoie-t-elle…
On considère la fonction :
def mystere(n):
c = 0
for k in range(1, n + 1):
if n % k == 0:
c = c + 1
return c
- a) Calculer
mystere(12)etmystere(7). - b) Que calcule cette fonction ?
- c) Pour quelles valeurs de
nsupérieures à 1 la fonction renvoie-t-elle 2 ?
Écrire une fonction Python somme_diviseurs(n) qui renvoie la somme des diviseurs positifs de l'entier $n$ distincts de $n$. Un entier $n$ est dit parfait s'il est égal à…
Écrire une fonction Python somme_diviseurs(n) qui renvoie la somme des diviseurs positifs de l'entier $n$ distincts de $n$. Un entier $n$ est dit parfait s'il est égal à cette somme.
- a) Calculer
somme_diviseurs(6)etsomme_diviseurs(12). - b) Écrire une fonction
est_parfait(n)qui renvoieTruesi $n$ est parfait. - c) Vérifier que 28 est parfait.
La boucle while
Quand on ne sait pas à l'avance combien de répétitions seront nécessaires, on utilise while : le bloc est répété tant que la condition est vraie. On s'arrête dès qu'elle devient fausse.
Retour à Lucas : son capital de départ est 1 000 € et il augmente de 3 % par an, donc il est multiplié par le coefficient multiplicateur $1 + 0{,}03 = 1{,}03$.
capital = 1000
n = 0
while capital < 1200:
capital = capital * 1.03
n = n + 1
À la fin, n est le nombre d'années nécessaires pour atteindre au moins 1 200 €.
n |
capital (arrondi) |
|---|---|
| 0 | 1 000 |
| 1 | 1 030 |
| 2 | 1 060,90 |
| 3 | 1 092,73 |
| 4 | 1 125,51 |
| 5 | 1 159,27 |
| 6 | 1 194,05 |
| 7 | 1 229,87 |
Au tour 6, le capital est encore inférieur à 1 200 ; au tour 7, il le dépasse : la boucle s'arrête avec $n = 7$. Retour au début : Lucas atteindra 1 200 € au bout de 7 ans.
Une association place 1 000 € à un taux annuel de 3 %. On considère : a) Que représente n à la fin de l'exécution ? b) Déterminer la valeur de n.
Une association place 1 000 € à un taux annuel de 3 %. On considère :
capital = 1000
n = 0
while capital < 1200:
capital = capital * 1.03
n = n + 1
- a) Que représente
nà la fin de l'exécution ? - b) Déterminer la valeur de
n.
Balayage et simulation
Encadrer √2 par balayage
Pour approcher $\sqrt{2}$, on part de 1 et on avance par pas de $0{,}01$ tant que le carré reste inférieur à 2.
x = 1
while x * x < 2:
x = x + 0.01
À la sortie, on a $x^2 \geqslant 2$ alors que la valeur précédente, $x - 0{,}01$, vérifie $(x-0{,}01)^2 < 2$. Donc
$$x - 0{,}01 < \sqrt{2} \leqslant x,$$ce qui est un encadrement de $\sqrt{2}$ d'amplitude $0{,}01$. Pour une amplitude de $10^{-n}$, on prend un pas de $10^{-n}$.
Simuler une expérience aléatoire
La fonction randint(a, b) du module random renvoie un entier au hasard entre a et b inclus, chaque valeur étant équiprobable. randint(1, 6) simule un dé équilibré.
from random import randint
def jeu():
n = 0
while randint(1, 6) != 6:
n = n + 1
return n
jeu() compte le nombre de lancers avant d'obtenir un 6. Il vaut 0 si le premier lancer donne 6 (probabilité $\frac{1}{6}$) ; il vaut 1 si le premier n'est pas un 6 et le second est un 6 (probabilité $\frac{5}{6} \times \frac{1}{6}$).
Pour estimer la valeur moyenne, on répète l'expérience $N$ fois :
def moyenne(N):
total = 0
for i in range(N):
total = total + jeu()
return total / N
D'après la loi des grands nombres, quand $N$ est grand, la moyenne observée est en général proche de la valeur théorique.
On cherche une valeur approchée de $\sqrt{2}$ par balayage. On considère : a) Quelle propriété vérifie la valeur finale de x par rapport à $\sqrt{2}$ ? b) Donner la…
On cherche une valeur approchée de $\sqrt{2}$ par balayage. On considère :
x = 1
while x * x < 2:
x = x + 0.01
- a) Quelle propriété vérifie la valeur finale de
xpar rapport à $\sqrt{2}$ ? - b) Donner la valeur finale de
x, au centième. - c) Modifier le programme pour obtenir un encadrement de $\sqrt{2}$ d'amplitude $0,001$.
On lance un dé équilibré à six faces. On considère : a) Que représente la valeur renvoyée par jeu() ? b) Quelle est la probabilité que jeu() renvoie 0 ? Que…
On lance un dé équilibré à six faces. On considère :
from random import randint
def jeu():
n = 0
while randint(1, 6) != 6:
n = n + 1
return n
- a) Que représente la valeur renvoyée par
jeu()? - b) Quelle est la probabilité que
jeu()renvoie 0 ? Que renvoie-t-elle 1 ? - c) Écrire une fonction
moyenne(N)qui simuleNparties et renvoie la moyenne des résultats dejeu().
L'essentiel
-
Une affectation
x = expressioncalcule d'abord le membre de droite, puis range le résultat dansx; un programme s'exécute ligne par ligne. -
Une fonction
def f(x):reçoit des arguments et renvoie un résultat avecreturn. -
if … elsechoisit un bloc selon une condition ;a % b == 0teste si $b$ divise $a$. -
for i in range(a, b)répète un nombre connu de fois, avecbexclu ;while conditionrépète tant que la condition est vraie. -
Pour suivre un programme, on dresse un tableau des valeurs des variables.
-
Un balayage de pas $10^{-n}$ donne un encadrement de $\sqrt{2}$ d'amplitude $10^{-n}$ ;
randintpermet de simuler des expériences aléatoires.