Pourquoi étudier l'algorithmique ?
Un ordinateur calcule très vite, mais il ne devine rien. Pour lui faire résoudre un problème, il faut décrire une suite d'instructions sans ambiguïté. Cette description s'appelle un algorithme. Python est un langage qui permet de la rendre exécutable.
Du langage naturel à Python
Lire un programme de haut en bas
Sauf instruction particulière, Python exécute les lignes dans l'ordre. Les espaces au début d'une ligne, appelés indentation, indiquent les blocs appartenant à une condition, une boucle ou une fonction.
Afficher n'est pas renvoyer
Variables, types et affectations
Une variable informatique est une boite nommée
Les quatre types essentiels
| Type Python | Nom | Exemple | Valeur |
|---|---|---|---|
int | entier | \(\texttt{n = 12}\) | \(12\) |
float | flottant | \(\texttt{x = 2.5}\) | approximation décimale |
str | chaine de caractères | \(\texttt{mot = "lycee"}\) | texte |
bool | booléen | \(\texttt{ok = x > 0}\) | True ou False |
Calculs, comparaisons et booléens
Opérateurs numériques
| Python | Mathématiques | Exemple |
|---|---|---|
+, -, *, / | \(+,-,\times,\div\) | 7 / 2 donne 3.5 |
** | puissance | 3 ** 2 donne 9 |
// | quotient entier | 17 // 5 donne 3 |
% | reste | 17 % 5 donne 2 |
Comparaisons et connecteurs logiques
| Python | Sens | Python | Sens |
|---|---|---|---|
| \(\texttt{==}\) | est égal à | \(\texttt{!=}\) | est différent de |
| \(\texttt{<}, \texttt{<=}\) | inférieur, inférieur ou égal | \(\texttt{>}, \texttt{>=}\) | supérieur, supérieur ou égal |
and | et : deux conditions vraies | or | ou : au moins une vraie |
not | négation |
Choisir avec if, elif, else
Répéter un nombre connu de fois : la boucle for
Comprendre range
| Instruction | Valeurs prises par i | Nombre de tours |
|---|---|---|
range(5) | \(0,1,2,3,4\) | 5 |
range(2, 6) | \(2,3,4,5\) | 4 |
range(1, 10, 2) | \(1,3,5,7,9\) | 5 |
range(6, 1, -1) | \(6,5,4,3,2\) | 5 |
Accumuler une somme
Compter des valeurs qui vérifient une condition
Répéter jusqu'à un seuil : la boucle while
Construire des fonctions réutilisables
Simuler une expérience aléatoire
Une réalisation n'est pas une probabilité
Répéter pour obtenir une fréquence
Lire une fonction statistique
Le programme demande de savoir lire une fonction renvoyant une moyenne ou un écart type, sans exiger la connaissance des listes. Il faut donc comprendre le rôle des étapes, même si certaines écritures seront fournies.
Tester, expliquer et corriger un programme
Pour aller plus loin : raisonner sur les algorithmes
L'invariant : une preuve qui accompagne la boucle
La dichotomie : éliminer la moitié à chaque étape
On cherche une valeur approchée de \(\sqrt{2}\), donc un nombre \(x\) tel que \(x^2=2\). On sait que \(1^2<2<2^2\).
def racine2(epsilon):
a = 1.0
b = 2.0
while b - a > epsilon:
m = (a + b) / 2
if m ** 2 < 2:
a = m
else:
b = m
return (a + b) / 2
Euclide : un algorithme vieux de plus de deux mille ans
def pgcd(a, b):
while b != 0:
a, b = b, a
return a
Boite à outils Python de Seconde
Exercices progressifs
Pour chaque programme, commence par prévoir le résultat sans ordinateur. Une table de trace est toujours autorisée et souvent recommandée.
Exercice 1 ★☆☆ : Types et affectations
On exécute :
a = 7
b = 2.5
nom = "Ada"
test = a > 5
a = a + 3
b = a / 4
Donne le type initial de chacune des variables
a,b,nomettest.Donne les valeurs finales de
a,b,nomettest.Explique pourquoi la dernière valeur de
best un flottant.
Exercice 2 ★☆☆ : Construire une table de trace
x = 5
y = 2
x = x + y
y = 2 * x - y
x = y - x
print(x, y)
Construis une table donnant les valeurs de x et y après chaque affectation, puis indique l'affichage final.
Exercice 3 ★☆☆ : Traduire une formule
Écris une fonction
prix_ttc(prix_ht, taux)qui renvoie le prix TTC pour un taux exprimé en pourcentage.Calcule à la main puis avec ta fonction le prix TTC d'un objet à \(60\) euros soumis à un taux de \(20\,\%\).
Écris une fonction
distance(vitesse, duree)qui renvoie la distance parcourue à vitesse constante.
Exercice 4 ★☆☆ : Trois cas
On considère la fonction :
def signe(x):
if x > 0:
return 1
elif x == 0:
return 0
else:
return -1
Que renvoient
signe(-4),signe(0)etsigne(2.7)?Pourquoi le dernier
elsecorrespond-il nécessairement à \(x<0\) ?Écris une fonction
minimum(a, b)qui renvoie le plus petit des deux nombres.
Exercice 5 ★★☆ : Traduire un ensemble par une condition
On veut tester si un réel \(x\) appartient à
Écris une expression booléenne Python qui vaut
Trueexactement lorsque \(x\in E\).Teste mentalement \(x=-3\), \(x=2\), \(x=5\) et \(x=5{,}1\).
Écris une expression équivalente à
not(x in E), sans utilisernot.
Exercice 6 ★☆☆ : Maitriser range
Donne, sans ordinateur, toutes les valeurs successives de k et le nombre de tours pour :
range(4);range(3, 8);range(2, 13, 3);range(10, 3, -2).
Puis indique ce qu'affiche :
for k in range(1, 6):
print(2 * k)
Exercice 7 ★★☆ : La somme des nombres impairs
def somme_impairs(n):
s = 0
for k in range(n):
s = s + (2 * k + 1)
return s
Fais une table de trace pour \(n=4\).
Conjecture une formule simple pour le résultat en fonction de \(n\).
Montre que \((k+1)^2-k^2=2k+1\).
Explique pourquoi cette égalité prouve ta conjecture.
Exercice 8 ★★☆ : Compter les diviseurs
Complète la fonction suivante afin qu'elle renvoie le nombre de diviseurs positifs de \(n\) :
def nombre_diviseurs(n):
compteur = ...
for d in range(..., ...):
if ...:
compteur = ...
return compteur
Utilise-la ensuite pour écrire est_premier(n), qui renvoie True exactement lorsque \(n\) est premier. Pense au cas \(n<2\).
Exercice 9 ★★☆ : Une épargne atteint un seuil
Un capital de \(500\) euros augmente de \(1{,}5\,\%\) par mois. On exécute :
capital = 500
mois = 0
while capital < 600:
capital = capital * 1.015
mois = mois + 1
print(mois, capital)
Explique le rôle de chaque variable et la condition de la boucle.
Pourquoi la boucle finit-elle par s'arrêter ?
Montre qu'après \(n\) mois, le capital vaut \(500\times1{,}015^n\).
Détermine la valeur affichée pour
moiset encadre le capital final au centime.
Exercice 10 ★★☆ : Composer des fonctions
Écris les fonctions suivantes :
carre(x), qui renvoie \(x^2\) ;distance_origine(x, y), qui renvoie \(\sqrt{x^2+y^2}\) en appelantcarre;dans_disque(x, y, r), qui renvoie un booléen indiquant si le point \((x;y)\) appartient au disque de centre l'origine et de rayon \(r\).
Teste les points \((3;4)\) avec \(r=5\) puis \((4;4)\) avec \(r=5\).
Exercice 11 ★★☆ : Déboguer sans deviner
La fonction suivante est censée renvoyer la moyenne des entiers de \(1\) à \(n\) :
def moyenne_entiers(n):
somme = 0
for k in range(1, n):
somme = somme + k
return somme / n + 1
Montre sur \(n=3\) que le résultat est faux.
Repère les deux erreurs logiques indépendantes.
Propose une version corrigée.
Démontre que le résultat renvoyé vaut \((n+1)/2\).
Exercice 12 ★★☆ : Deux dés simulés
On lance deux dés équilibrés et on s'intéresse à l'évènement « la somme est au moins \(10\) ».
Complète la fonction de simulation.
from random import randint def frequence_somme_10(n): succes = 0 for k in range(n): d1 = randint(..., ...) d2 = randint(..., ...) if ...: succes = ... return ...Calcule exactement la probabilité recherchée en dénombrant les \(36\) couples équiprobables.
Quelle valeur attends-tu approximativement pour \(n=100000\) ? Pourquoi ne sera-t-elle presque jamais exacte ?
Exercice 13 ★★☆ : Lire une fonction d'écart type
On reprend la fonction du cours.
def ecart_type(valeurs):
m = moyenne(valeurs)
somme = 0
for x in valeurs:
somme = somme + (x - m) ** 2
return sqrt(somme / len(valeurs))
Explique chaque ligne en français.
Calcule à la main le résultat pour
valeurs = [2, 2, 6, 6].Que renvoie la fonction si toutes les valeurs sont égales ? Justifie sans exécuter le code.
Exercice 14 ★★★ : Approcher \(\sqrt3\) par dichotomie
Complète les quatre zones :
def racine3(epsilon):
a = 1.0
b = 2.0
while ...:
m = ...
if ...:
a = m
else:
...
return (a + b) / 2
Effectue deux tours à la main à partir de \([1;2]\).
Montre que \(a\leqslant\sqrt3\leqslant b\) reste vrai après chaque tour.
Si la fonction s'arrête lorsque \(b-a\leqslant10^{-3}\), majore l'erreur sur la valeur renvoyée.
Exercice 15 ★★★ : Comprendre l'algorithme d'Euclide
On considère :
def pgcd(a, b):
while b != 0:
a, b = b, a
return a
Construis la table de trace pour
pgcd(252, 105).Vérifie que la fonction renvoie \(21\) et que \(21\) divise les deux entiers initiaux.
Si \(a=bq+r\), montre qu'un entier divise \(a\) et \(b\) si et seulement s'il divise \(b\) et \(r\).
Explique pourquoi le deuxième nombre diminue strictement tant qu'il n'est pas nul. Déduis-en que la boucle s'arrête.
Conclus que la valeur renvoyée est bien le PGCD.
Problème défi : le coffre à code
Un coffre choisit secrètement un entier \(s\) entre \(1\) et \(100\). À chaque question, on propose un entier \(m\) et le coffre répond si \(s\leqslant m\). On veut retrouver le secret en posant le moins de questions possible. Toutes les parties sont guidées ; les résultats précédents peuvent être réutilisés.
Partie A : découvrir la stratégie
On part de \([a;b]=[1;100]\) et on choisit à chaque étape \(m=(a+b)//2\).
Si \(m=50\) et si la réponse est « non », quel nouvel intervalle contient \(s\) ?
Si la réponse est « oui », quel nouvel intervalle contient \(s\) ?
Explique pourquoi le nombre de candidats est approximativement divisé par \(2\) à chaque question.
Retrouve \(s=73\) en indiquant successivement les intervalles et les milieux.
Partie B : lire et justifier le programme
def nombre_questions(secret, maximum):
a = 1
b = maximum
questions = 0
while a < b:
m = (a + b) // 2
if secret <= m:
b = m
else:
a = m + 1
questions = questions + 1
return questions
Pourquoi la condition est-elle
a < bet nona <= b?Montre que l'invariant \(a\leqslant s\leqslant b\) est vrai au départ et conservé par les deux branches.
Montre que la longueur \(b-a+1\) de l'intervalle diminue strictement si \(a<b\).
Déduis des deux questions précédentes qu'à la sortie on a \(a=b=s\).
Vérifie que
nombre_questions(73, 100)renvoie \(7\).
Partie C : garantir un nombre maximal de questions
Après \(k\) questions, le nombre de candidats est au plus
Explique cette formule à partir du partage en deux moitiés.
Compare \(2^6\), \(2^7\) et \(100\). Prouve que sept questions suffisent toujours, alors que six ne peuvent pas suffire dans tous les cas.
Complète le programme qui vérifie les cent secrets et renvoie le pire nombre de questions.
def pire_cas(maximum): pire = 0 for secret in range(..., ...): q = ... if ...: pire = ... return pire
Partie D : secret aléatoire et nombre moyen de questions
Complète la simulation suivante.
from random import randint def moyenne_questions(n): total = 0 for k in range(n): secret = randint(..., ...) total = total + ... return ...Une exécution avec un grand \(n\) donne environ \(6{,}72\). Explique pourquoi ce résultat varie légèrement et pourquoi il reste inférieur à \(7\).
Partie E : quand une réponse peut être fausse
Chaque réponse du coffre a une probabilité \(0{,}05\) d'être erronée. Pour sécuriser une question, on la pose trois fois et on garde la réponse majoritaire. On suppose les trois réponses indépendantes.
La majorité est fausse s'il y a exactement deux ou exactement trois erreurs. Montre que cette probabilité vaut
\[3\times0{,}05^2\times0{,}95+0{,}05^3=0{,}00725.\]Complète la fonction qui renvoie
Truelorsque la majorité des trois réponses est correcte.from random import random def reponse_majoritaire_correcte(): correctes = 0 for k in range(3): if random() >= ...: correctes = correctes + 1 return correctes >= ...Compare \(0{,}00725\) à \(0{,}05\) et explique l'intérêt, mais aussi le cout, de la répétition.
Une erreur au début peut-elle être réparée par la suite par l'algorithme de dichotomie ? Explique pourquoi il faut sécuriser chaque réponse.
Corrigés détaillés des exercices
Corrigé 1
Corrigé 2
Corrigé 3
Corrigé 4
Corrigé 5
Corrigé 6
Corrigé 7
Corrigé 8
Corrigé 9
Corrigé 10
Corrigé 11
Corrigé 12
Corrigé 13
Corrigé 14
Corrigé 15
Corrigé détaillé du problème
Partie A : découvrir la stratégie
Partie B : lire et justifier le programme
Partie C : garantir le pire cas
Partie D : moyenne pour un secret aléatoire
Partie E : réponses imparfaites
Fiche-mémoire
Maîtrise du chapitre
Validation contrôlée
Réponds aux QCM, sélectionne les bonnes propositions ou remets les étapes dans l'ordre. Le site vérifie chaque réponse avant d'ouvrir la balise suivante.