✏️ Exercices — Algorithmique & programmation (Python)
Thèmes : variables • affectation • tests • boucles • Python • simulation numérique/statistique.
Objectif : raisonner (traces, invariants, pièges de types), écrire des algorithmes propres,
et relier simulation ↔ théorie.
Exercice 1 — Variables, types, conversions — pièges de input()
2ndeConsigne. On exécute ce script :
age = input("Âge ? ")
x = input("Nombre réel ? ")
print(age + 1)
print(x * 2)
- (a) Expliquer précisément l’erreur (ou le comportement) de
print(age + 1). - (b) Si l’utilisateur tape
age = 17, que donneprint(x * 2)six = 3.5? (Justifier.) - (c) Corriger le script pour qu’il affiche age+1 et 2x comme des nombres.
- (d) Donner un exemple d’entrée pour laquelle la conversion
int(...)échoue, et expliquer pourquoi.
Exercice 2 — Affectation, priorité, // et % — lecture de trace
2ndeConsigne. On pose a=17, b=5. Calculer exactement :
- (a) \(a + b * 2\) puis \((a+b)*2\).
- (b)
a / b,a // b,a % bet interpréter (division euclidienne). - (c) On exécute :
a = a + b; b = a - b; a = a - b. Quelles valeurs finales deaetb? Que fait cet algorithme ? - (d) Même question avec :
a,b = b,a. Pourquoi est-ce plus sûr ?
Exercice 3 — Tests — appartenance à un intervalle et logique
2ndeConsigne. Écrire des conditions Python (sans erreurs de borne) :
- (a) Tester si \(x\in[-2 ; 5[\).
- (b) Tester si \(x\notin[0 ; 1]\).
- (c) Tester si \(x\in]-\infty ; -3]\cup[2 ; +\infty[\).
- (d) Tester si \(x\in[1 ; 4]\) ET \(x\neq 3\).
Exercice 4 — Logique — lois de De Morgan (piège classique)
2ndeConsigne. On considère la condition :
not( (x >= 0 and x <= 1) or (x == 3) )
- (a) Réécrire cette condition sans
noten utilisant seulementandetor. - (b) Donner l’ensemble des valeurs de \(x\) (en intervalle) qui valident la condition.
- (c) Vérifier avec \(x=0{,}5\), \(x=2\), \(x=3\), \(x=-1\).
- (d) Écrire une version équivalente plus lisible avec variables booléennes.
Exercice 5 — Boucle while — seuil + arrêt garanti
2ndeConsigne. On définit \(u_0=1\) et \(u_{n+1}=1{,}15u_n+2\).
- (a) Écrire un programme qui calcule le plus petit \(n\) tel que \(u_n\ge 100\).
- (b) Faire une trace manuelle des 4 premiers termes \(u_0,u_1,u_2,u_3\).
- (c) Expliquer pourquoi le programme s’arrête (argument mathématique simple).
- (d) Modifier pour afficher aussi la valeur de \(u_n\) au moment de l’arrêt.
Exercice 6 — Boucle for — sommes et formules (vérification)
2ndeConsigne. On veut calculer \(S=1^2+2^2+\cdots+n^2\).
- (a) Écrire un programme avec
forpour calculerS. - (b) Calculer à la main pour \(n=5\).
- (c) Vérifier la formule : \(S=\dfrac{n(n+1)(2n+1)}{6}\) pour \(n=5\).
- (d) Modifier le programme pour vérifier automatiquement la formule pour \(n=1..50\) (test de cohérence).
Exercice 7 — Listes — min, max, position (indice) sans fonctions toutes faites
2ndeConsigne. On a une liste de notes : L=[12, 8, 15, 15, 9, 18, 7].
- (a) Écrire un algorithme (sans
min/max) qui calcule le minimum et le maximum. - (b) Écrire un algorithme qui renvoie l’indice de la première occurrence du maximum.
- (c) Calculer à la main min, max et l’indice demandé.
- (d) Expliquer le piège si on initialise
min=0au lieu demin=L[0].
Exercice 8 — Comptage — fréquences et pourcentages (statistiques)
2ndeConsigne. Une liste L contient des valeurs 0/1 (0=échec, 1=succès) :
L = [1,0,1,1,0,0,1,1,1,0]
- (a) Calculer le nombre de succès.
- (b) Calculer la fréquence de succès (entre 0 et 1).
- (c) Calculer le pourcentage de succès (entre 0 et 100).
- (d) Écrire une fonction
freq(L)qui renvoie 0 si la liste est vide.
Exercice 9 — Fonctions — factorial + validation (robustesse)
2ndeConsigne. On veut coder la factorielle \(n!\) (pour \(n\in\mathbb{N}\)).
- (a) Écrire
fact(n)avec une bouclefor. - (b) Que doit renvoyer
fact(0)? Justifier. - (c) Modifier
factpour refuser (par exemple retournerNone) sinn’est pas un entier naturel. - (d) Calculer
fact(6)et vérifier le résultat.
Exercice 10 — Algorithme d’Euclide — PGCD en Python + preuve d’invariant
2ndeConsigne. On veut calculer \(\mathrm{PGCD}(a,b)\) avec Euclide.
- (a) Compléter le programme :
- (b) Faire la trace pour \(a=9999\), \(b=3663\) et trouver le résultat.
- (c) Donner l’invariant : pourquoi le PGCD ne change pas quand on remplace \((a,b)\) par \((b, a\%b)\) ?
- (d) Comment adapter si on autorise des entrées négatives ?
def pgcd(a, b):
while b != 0:
r = a % b
a = b
b = r
return a
Exercice 11 — Simulation — pièce biaisée, fréquence et estimation
2ndeConsigne. Une pièce donne Pile avec probabilité inconnue \(p\). On simule N lancers et on observe la fréquence.
- (a) Écrire un script qui simule N lancers d’une pièce équilibrée (p=0,5) et renvoie la fréquence de Pile.
- (b) Pourquoi la fréquence n’est-elle pas exactement 0,5 ?
- (c) Modifier pour une pièce biaisée p=0,62 (avec
random.random()). - (d) Expliquer l’effet de N (ex : N=100, N=10 000) sur la stabilité de la fréquence.
Exercice 12 — Simulation — “au moins un 6 en 4 lancers” (lien théorie)
2ndeConsigne. On lance un dé 4 fois.
- (a) Écrire une simulation qui estime la probabilité d’obtenir au moins un 6.
- (b) Donner la probabilité théorique exacte.
- (c) Expliquer pourquoi il est plus simple de calculer la probabilité contraire.
- (d) Comparer simulation et théorie pour N=50 000 (sans exécuter : expliquer ce qu’on doit observer).
Exercice 13 — Boucles imbriquées — coût (nombre d’opérations)
2ndeConsigne. On considère :
n = 10
c = 0
for i in range(n):
for j in range(i, n):
c += 1
- (a) Pour n=4, lister les couples (i,j) parcourus.
- (b) Exprimer c en fonction de n (formule).
- (c) Calculer c pour n=10.
- (d) Donner l’ordre de grandeur du coût (≈ proportionnel à quoi ?) quand n est grand.
Exercice 14 — Suites — calcul d’un terme et somme partielle
2ndeConsigne. On définit \(u_0=2\) et \(u_{n+1}=2u_n+1\).
- (a) Écrire un programme qui calcule \(u_n\) pour une valeur n donnée.
- (b) Calculer à la main \(u_1,u_2,u_3\).
- (c) Écrire un programme qui calcule \(S_n=u_0+u_1+\cdots+u_n\).
- (d) Donner une conjecture simple sur la forme de \(u_n\) (observer les valeurs) et la justifier brièvement.
Exercice 15 — Recherche du plus petit n — somme dépasse un seuil
2ndeConsigne. On cherche le plus petit \(n\) tel que \(1+2+\cdots+n \ge 1000\).
- (a) Écrire un programme avec
whilequi trouve ce n. - (b) Expliquer pourquoi ce programme termine.
- (c) Sans programme : utiliser une estimation avec \(\frac{n(n+1)}{2}\) pour encadrer n.
- (d) Vérifier à la fin que le n trouvé est bien minimal (condition double).
Exercice 16 — Erreurs de boucle — détecter et corriger (debug)
2ndeConsigne. Le but est de calculer la somme des entiers de 1 à n. Mais ce code est faux :
def somme(n):
S = 0
for k in range(n):
S = S + k
return S
- (a) Tester mentalement pour n=1,2,3 : que renvoie la fonction ?
- (b) Expliquer l’erreur (borne de range et terme ajouté).
- (c) Corriger de 2 façons différentes.
- (d) Ajouter une vérification : si n<1, renvoyer 0.
Exercice 17 — Recherche — premier indice qui vérifie une condition
2ndeConsigne. On a une liste L=[-3, 7, 0, 12, -1, 5]. On cherche l’indice du premier élément strictement positif.
- (a) Écrire un programme qui renvoie cet indice (ou -1 si aucun).
- (b) Donner la valeur pour la liste donnée.
- (c) Modifier pour renvoyer aussi la valeur trouvée.
- (d) Expliquer la différence entre “premier positif” et “max” (erreur fréquente).
Exercice 18 — Nombres premiers — test de primalité (efficace)
2ndeConsigne. On veut tester si un entier n est premier.
- (a) Écrire une fonction
est_premier(n)qui renvoie True/False (n≥0). - (b) Pourquoi suffit-il de tester les diviseurs jusqu’à \(\sqrt{n}\) ?
- (c) Tester mentalement : 1, 2, 9, 17, 221 (donner résultat + justification rapide).
- (d) Ajouter une optimisation : ignorer les nombres pairs > 2.
Exercice 19 — Statistiques — moyenne, variance (niveau propre)
2ndeConsigne. On a une série : L=[2, 4, 4, 4, 5, 5, 7, 9].
- (a) Calculer la moyenne.
- (b) Calculer la variance \(V=\frac{1}{n}\sum (x_i-\bar x)^2\).
- (c) Écrire un programme qui calcule moyenne et variance.
- (d) Donner l’écart-type \(\sigma=\sqrt{V}\) et interpréter (dispersion).
Exercice 20 — Arrondis — erreurs accumulées (flottants)
2ndeConsigne. On calcule une somme de décimaux :
S = 0.0
for i in range(10):
S += 0.1
print(S)
- (a) Que devrait-on obtenir “en maths” ?
- (b) Pourquoi Python peut afficher 0.999999999... ? (explication simple)
- (c) Donner une solution pour comparer des réels “à epsilon près”.
- (d) Proposer une solution “exacte” en utilisant des entiers.
Exercice 21 — Dictionnaire (option 2nde+) — comptage de valeurs
2ndeConsigne. On a une liste de lettres : L=list("abacaba").
- (a) Compter combien de fois apparaît chaque lettre (sans
count). - (b) Donner le résultat attendu.
- (c) Écrire une fonction
freq_lettres(texte)(texte = str) qui renvoie un dictionnaire. - (d) Quel est l’avantage d’un dictionnaire sur une liste pour ce problème ?
Exercice 22 — Boucle while — méthode de Babylone (approximation de √a)
2ndeConsigne. Pour \(a>0\), on approxime \(\sqrt{a}\) par :
\(x_{0}=a\) et \(x_{n+1}=\dfrac{1}{2}\left(x_n+\dfrac{a}{x_n}\right)\).
- (a) Écrire un programme qui calcule une approximation de \(\sqrt{a}\) avec un seuil : s’arrêter quand \(|x_{n+1}-x_n|<10^{-6}\).
- (b) Calculer à la main deux itérations pour \(a=2\) (à 4 décimales).
- (c) Expliquer pourquoi on met un seuil plutôt qu’un nombre fixe d’itérations.
- (d) Ajouter une protection si a≤0 (renvoyer None).
Exercice 23 — Tri (niveau raisonnement) — vérifier si une liste est croissante
2ndeConsigne. Écrire est_croissante(L) qui renvoie True si la liste est non décroissante.
- (a) Donner l’algorithme (balayage + comparaison voisins).
- (b) Tester sur
[1,2,2,5]et[1,3,2]. - (c) Modifier pour renvoyer aussi le premier indice où ça “casse”.
- (d) Expliquer la complexité (nombre de comparaisons).
Exercice 24 — Histogramme — regrouper des valeurs en classes (stats)
2ndeConsigne. On a des notes entières entre 0 et 20 dans une liste L. On veut compter par classes : [0 ; 5[, [5 ; 10[, [10 ; 15[, [15 ; 21[.
- (a) Écrire un programme qui renvoie un tableau de 4 compteurs.
- (b) Sur l’exemple
L=[2,5,7,10,14,15,20,9,0,18], donner les compteurs. - (c) Convertir les compteurs en pourcentages.
- (d) Expliquer le piège de la borne 20 (dans quelle classe ?).
Exercice 25 — Challenge final — loi binomiale via simulation (très complet)
2ndeConsigne. On considère 20 lancers d’une pièce équilibrée. Soit X le nombre de piles. On veut estimer \(P(X\ge 15)\).
- (a) Écrire une simulation (N expériences) qui estime \(P(X\ge 15)\).
- (b) Donner la formule théorique exacte (sans calculer numériquement) avec la loi binomiale.
- (c) Expliquer pourquoi l’événement \(X\ge 15\) est “rare” et ce que ça implique sur N.
- (d) Proposer une stratégie de vérification : comparer aussi \(P(X\le 5)\) et expliquer la symétrie.