Consolidation : variables, conditions, boucles, fonctions
Cours complet · algorithmique et programmation (première), chapitre 1 · première, algorithmique et programmation
Travailler ce chapitre sur Adloun
La classe de seconde a mis en place les briques de la programmation : variables, instructions conditionnelles, boucles et fonctions. Ce chapitre les consolide — comme le demande le programme de première — en les tournant vers leurs usages de l'année : suites, seuils, second degré, simulations.
1.1 Variables, types et affectation
Une variable est une case de la mémoire, désignée par un nom, contenant une valeur d'un certain type : int (entier), float (flottant), str (chaîne), bool (booléen). L'affectation se note = en Python et en langage naturel :
se code u = 2*u + 3.
Le membre de droite est calculé d'abord, avec la valeur actuelle de u, puis rangé dans la case.
Les instructions s'exécutent dans l'ordre : intervertir deux lignes peut changer le résultat. En première, on enchaîne souvent deux mises à jour simultanées — le double affectation de Python est alors précieuse :
a, b = b, a + b # Fibonacci : les DEUX membres de droite sont calculés
# avant toute affectation ; a = b puis b = a + b serait faux !
Le « serait faux » mérite d'être vu plutôt que cru :
1.2 Instructions conditionnelles
delta = b**2 - 4*a*c
if delta > 0:
print("deux solutions")
elif delta == 0:
print("une solution")
else:
print("aucune solution réelle")
Conditions : ==, !=, <, <=, >, >=, combinées par and, or, not. Le bloc est délimité par l'indentation.
La disjonction des cas du discriminant (chapitre 3 du manuel de mathématiques) se code mot à mot : c'est l'exemple parfait de traduction d'un raisonnement mathématique en programme.
1.3 Boucles
# for : nombre de répétitions connu -- calcul du terme u_n d'une suite
u = 1
for i in range(n): # n tours : i = 0, 1, ..., n-1
u = 2*u + 3
# while : on répète TANT QU'une condition est vraie -- recherche de seuil
u, n = 1, 0
while u <= 10**6:
u = 2*u + 3
n = n + 1 # à la sortie : premier rang où u > 10^6
Méthode : Les trois motifs de boucle à maîtriser en première
- Itérer une récurrence : appliquer fois (calcul de ).
- Accumuler : sommer ou multiplier au fil de la boucle (sommes , factorielle, sommes géométriques).
- Chercher un seuil : boucle
whiletant que l'objectif n'est pas atteint, avec un compteur.
Choisir entre les deux boucles ne demande qu'une question :
def somme_geometrique(q, n):
# 1 + q + q^2 + ... + q^n : accumulateur + puissance itérée
S, puissance = 1, 1
for k in range(n):
puissance = puissance * q
S = S + puissance
return S
def seuil_capital(c0, taux, objectif):
# Nombre d'années pour qu'un capital à taux fixe atteigne un objectif
c, annees = c0, 0
while c < objectif:
c = c * (1 + taux)
annees = annees + 1
return annees
print(somme_geometrique(2, 10)) # 2047 = 2^11 - 1
print(seuil_capital(1000, 0.03, 2000)) # 24 (doublement à 3 % : 24 ans)
1.4 Fonctions
Une fonction regroupe un traitement sous un nom : def nom(parametres): suivi d'un bloc indenté et d'un return. Elle peut prendre plusieurs arguments et renvoyer plusieurs valeurs (un couple). return renvoie une valeur réutilisable ; print ne fait qu'afficher.
La dernière phrase — « return renvoie, print affiche » — est la source d'erreur la plus fréquente de l'année :
def discriminant(a, b, c):
return b**2 - 4*a*c
def racines(a, b, c):
# Renvoie le couple des racines si delta >= 0, None sinon
delta = discriminant(a, b, c)
if delta < 0:
return None
r = delta ** 0.5
return ((-b - r) / (2*a), (-b + r) / (2*a))
def pente_secante(f, a, h):
# Taux de variation de f entre a et a + h (chapitre Dérivation)
return (f(a + h) - f(a)) / h
print(racines(2, -5, -3)) # (-0.5, 3.0)
print(pente_secante(lambda x: x**2, 1, 0.001)) # 2.001 -> f'(1) = 2
Noter que racines appelle discriminant : première touche de programmation modulaire, développée au dernier chapitre.
1.5 Du langage naturel à Python
| Langage naturel | Python |
|---|---|
| `u = 5` | |
| Si … alors … sinon | `if …: … else:` |
| Pour allant de à | `for i in range(1, n + 1):` |
| Tant que … | `while …:` |
| Renvoyer … | `return …` |
Savoir traduire dans les deux sens reste une capacité attendue : les algorithmes du programme sont écrits « en langage naturel ou en Python ».
L'algorithme en langage naturel :
;
Tant que :
Renvoyer
se code :
def mystere():
u, n = 100, 0
while u > 50:
u = 0.9 * u
n = n + 1
return n # renvoie 7 : premier rang où 100 x 0,9^n <= 50
C'est un algorithme de seuil pour la suite géométrique : demi-vie d'une décroissance de par étape.
1.6 Exercices d'entraînement
Difficulté : ★ facile ★ moyen ★ plus difficile.
Exercice
Que renvoie f(4) ? Et f(7) ?
def f(n):
if n % 2 == 0:
return n // 2
else:
return 3*n + 1
Quel est le lien avec une suite étudiée dans le manuel de mathématiques ?
Solution
f(4) renvoie 2 ; f(7) renvoie 22. C'est la fonction de récurrence de la suite de Syracuse (chapitre Suites) : .
Exercice
Écrire une fonction terme(n) renvoyant le terme de la suite définie par et , puis donner à la main.
Solution
def terme(n):
u = 5
for i in range(n):
u = 0.8 * u + 4
return u
À la main : ; ; .
Exercice
Écrire une fonction somme_entiers(n) renvoyant par une boucle, puis une version sans boucle utilisant la formule du cours de mathématiques. Vérifier qu'elles coïncident pour .
Solution
def somme_entiers(n):
S = 0
for k in range(1, n + 1):
S = S + k
return S
def somme_formule(n):
return n * (n + 1) // 2
print(somme_entiers(100), somme_formule(100)) # 5050 5050
Exercice
Traduire en Python l'algorithme suivant, puis expliquer ce qu'il calcule pour la fonction :
;
Pour allant de à :
Si alors , sinon
Renvoyer
Solution
def dichotomie():
a, b = 0, 2
for k in range(20):
m = (a + b) / 2
if f(a) * f(m) <= 0:
b = m
else:
a = m
return m
C'est la dichotomie : on coupe l'intervalle en deux en gardant la moitié où change de signe. Pour sur , elle approche (précision ).
Exercice
Écrire une fonction tangente(a) qui, pour , renvoie le couple tel que la tangente au point d'abscisse ait pour équation .
Solution
La tangente est avec : pente et ordonnée à l'origine .
def tangente(a):
return (2*a, -a**2)
print(tangente(1)) # (2, -1) : y = 2x - 1, comme dans le cours
Exercice
La fonction suivante est incomplète :
def euler(h, n):
y = 1
for k in range(n):
y = ... # à compléter
return y
- Compléter pour qu'elle réalise la méthode d'Euler pour l'exponentielle (, ).
- Que renvoie
euler(1/n, n)quand devient grand ? Justifier avec le cours.
Solution
1. y = y * (1 + h) : sur un pas , .
2. euler(1/n, n) calcule , qui tend vers (chapitre Fonction exponentielle).
Exercice
Écrire une fonction simule_des() renvoyant le résultat d'un lancer de dé équilibré (utiliser randint du module random), puis une fonction frequence_six(N) estimant la probabilité d'obtenir un six sur lancers. Quelle valeur attend-on pour grand ?
Solution
from random import randint
def simule_des():
return randint(1, 6)
def frequence_six(N):
compteur = 0
for k in range(N):
if simule_des() == 6:
compteur += 1
return compteur / N
Pour grand, la fréquence se stabilise vers (loi des grands nombres) — le principe de toutes les simulations du chapitre Variables aléatoires.