Algorithmique et Python : 20 exercices corrigésmaths 2nde — du geste seul au problème de contrôle
Vingt exercices, du geste seul au problème : suivre un programme ligne à ligne, reconnaître un type, lire une condition, dérouler une boucle, écrire une fonction, simuler le hasard. Un placement à 4 %, le CO₂ de l'atmosphère, un dé lancé dix mille fois, la conjecture de Syracuse, la racine de 2 cherchée pas à pas. Chaque corrigé montre la trace du programme, tour après tour. Un rappel de cours avant chaque niveau. Cherche d'abord au brouillon, puis ouvre la correction.
Un seul geste : exercices 1 à 8niveau 1
Un programme par exercice : le suivre ligne à ligne en notant les valeurs.
Rappel de cours
- « x = x + 1 » n'est pas une égalité : c'est un ORDRE. On calcule à droite avec l'ancienne valeur, puis on range le résultat dans x.
- Les types : int (entier), float (nombre à virgule), str (texte, entre guillemets), bool (True ou False). « / » donne TOUJOURS un float ; « // » le quotient entier ; « % » le reste.
- « for i in range(1, 6) » : i prend les valeurs 1, 2, 3, 4, 5 — le 6 est EXCLU. « while condition » : on répète TANT QUE la condition est vraie.
1
Suivre ce programme ligne à ligne. Que valent a et b à la fin ?a = 5b = 3a = a + bb = a - ba = a - bVoir la correction
On note les valeurs après chaque ligne. À droite du signe « = », on utilise les valeurs du moment. Ligne 3 : a reçoit . Ligne 4 : b reçoit . Ligne 5 : a reçoit . À la fin, a vaut et b vaut : le programme a ÉCHANGÉ les deux valeurs. ⛔ Le piège : lire « a = a + b » comme une équation, et conclure que b vaut . En Python, « = » range une valeur, il n'affirme rien.ligne a b 1 5 – 2 5 3 3 8 3 4 8 5 5 3 5 2
Que vaut x à la fin de ce programme ?x = 2x = 3 * x + 1x = x ** 2Voir la correction
Ligne 2 : on calcule avec l'ANCIENNE valeur de x, puis x vaut . Ligne 3 : « ** » est la puissance : x reçoit . À la fin, x vaut . ⛔ Le piège : écrire le carré avec l'accent circonflexe, comme sur la calculatrice. En Python, le carré s'écrit « x ** 2 » ; l'accent circonflexe y fait une tout autre opération.ligne x 1 2 2 7 3 49 3
Donner la valeur et le type de chaque expression : a) « 7 » b) « 7.0 » c) « 7 / 2 » d) « 7 // 2 » e) « 7 % 2 » f) « '7' » g) « 3 < 5 »Voir la correction
a) , un entier : int. b) , un nombre à virgule : float (le point est la virgule de Python). c) : float. La division « / » donne toujours un float. d) : int. « // » donne le quotient entier (). e) : int. « % » donne le reste de la division. f) le texte « 7 », entre guillemets : str. Ce n'est plus un nombre. g) True : bool. Une comparaison vaut vrai ou faux. ⛔ Le piège au f) : croire que '7' et 7 sont la même chose. Les guillemets en font un TEXTE.expression valeur type 7 7 int 7.0 7.0 float 7 / 2 3.5 float 7 // 2 3 int 7 % 2 1 int '7' '7' str 3 < 5 True bool 4
Que renvoie Python pour chacune de ces expressions ? a) « 6 / 3 » b) « '3' + '4' » c) « 3 + 4 » d) « int('3') + 4 » e) « '3' * 2 »Voir la correction
a) « 2.0 », et non « 2 » : « / » donne toujours un float, même quand la division tombe juste. b) « '34' » : entre deux textes, « + » les COLLE bout à bout. c) « 7 » : entre deux nombres, « + » additionne. d) « 7 » : int('3') transforme le texte '3' en nombre , puis on ajoute . e) « '33' » : un texte multiplié par est répété deux fois. ⭐ Le même signe « + » ne fait pas la même chose selon le TYPE de ce qu'il relie.expression résultat 6 / 3 2.0 '3' + '4' '34' 3 + 4 7 int('3') + 4 7 '3' * 2 '33' 5
a) Qu'affiche ce programme ? b) Et si l'on remplace la première ligne par « n = 40 » ?n = 17if n % 2 == 0:print('pair')else:print('impair')Voir la correction
a) « n % 2 » est le reste de la division de n par : , le reste vaut . La condition « 1 == 0 » est fausse : on passe dans le « else », le programme affiche « impair ». b) , le reste vaut : la condition est vraie, il affiche « pair ». ⛔ Le piège : écrire « if n % 2 = 0 ». Un seul « = » RANGE une valeur ; pour COMPARER, il en faut deux : « == ».n n % 2 n % 2 == 0 affiche 17 1 False impair 40 0 True pair 6
Un cinéma applique ce tarif. Que renvoient « prix(8) », « prix(12) », « prix(17) » et « prix(18) » ?def prix(age):if age < 12:return 5elif age < 18:return 7else:return 10Voir la correction
On teste les conditions DANS L'ORDRE, et on s'arrête à la première vraie. prix(8) : est vrai, on renvoie . prix(12) : est FAUX ; est vrai, on renvoie . prix(17) : faux, vrai : . prix(18) : les deux sont faux, on arrive au « else » : . ⛔ Le piège : prix(12) = . Avec « < », n'est pas strictement inférieur à : à ans, on paie déjà €.âge age < 12 age < 18 prix 8 True – 5 12 False True 7 17 False True 7 18 False False 10 7
Qu'affiche ce programme ? Faire la trace de i et de s.s = 0for i in range(1, 6):s = s + iprint(s)Voir la correction
« range(1, 6) » donne i = , , , , : le est exclu. À chaque tour, on ajoute i à s : , puis , , , . Le programme affiche : c'est . ⛔ Le piège : faire aussi un tour avec i = , et trouver . La borne de droite d'un range n'est jamais atteinte.tour i s 1 1 1 2 2 3 3 3 6 4 4 10 5 5 15 8
Qu'affiche ce programme ? Combien de fois la boucle tourne-t-elle ?n = 1while n < 100:n = n * 2print(n)Voir la correction
On répète TANT QUE n est inférieur à , et on teste AVANT chaque tour. n vaut successivement , , , , , , : à chaque fois, , on continue. Avec n = , on fait encore un tour : n devient . Maintenant est faux : on sort. La boucle a tourné fois, et le programme affiche . ⛔ Le piège : répondre , « le dernier nombre sous ». La boucle s'arrête quand la condition devient FAUSSE, donc après l'avoir dépassé.tour n avant n < 100 ? n après 1 1 oui 2 2 2 oui 4 3 4 oui 8 4 8 oui 16 5 16 oui 32 6 32 oui 64 7 64 oui 128
Type devoir : exercices 9 à 16niveau 2
Plusieurs étapes, comme au contrôle : lire une fonction, compléter un programme, en écrire un.
Rappel de cours
- Une fonction : « def nom(x): » puis, en retrait, les instructions, et « return » pour rendre le résultat.
- Une liste s'écrit entre crochets : « [12, 8, 15] ». « len(L) » donne sa longueur ; « for n in L » parcourt ses éléments.
- L'INDENTATION (le retrait) dit ce qui est DANS la boucle ou la condition. Elle fait partie du programme.
9
a) Que renvoient « f(2) », « f(-1) » et « f(0) » ? b) Quelle fonction mathématique ce programme calcule-t-il ?def f(x):return 3 * x ** 2 - 5Voir la correction
a) On remplace x par la valeur donnée. « ** » passe avant « * », qui passe avant « - » : les priorités des maths. . . . b) C'est la fonction . ⛔ Le piège au a) : taper « -1 ** 2 » dans la console. Python calcule d'abord la puissance : il obtient . Quand on appelle f(-1), la valeur remplace x tout entier, comme si on écrivait .appel calcul renvoie f(2) 3 * 4 - 5 7 f(-1) 3 * 1 - 5 -2 f(0) 3 * 0 - 5 -5 10
Qu'affiche ce programme ? Que calcule-t-il ?notes = [12, 8, 15, 11, 14]s = 0for n in notes:s = s + nprint(s / len(notes))Voir la correction
La boucle parcourt la liste : n prend les valeurs , , , , , et s les additionne : , , , , . « len(notes) » vaut , le nombre de notes. Le programme affiche « 12.0 » : c'est la MOYENNE des notes, . ⭐ « 12.0 » et non « 12 » : la division « / » donne un float, même quand elle tombe juste.tour n s 1 12 12 2 8 20 3 15 35 4 11 46 5 14 60 11
On place € à % par an (intérêts composés). Ce programme cherche au bout de combien d'années le capital dépasse €. a) Expliquer la ligne « c = c * 1.04 ». b) Qu'affiche le programme ?c = 1000n = 0while c < 1500:c = c * 1.04n = n + 1print(n)Voir la correction
a) Augmenter de %, c'est multiplier par . Chaque tour de boucle fait passer une année. b) On déroule, au centime : ; ; … ; au bout de ans, € : encore sous , on continue. Au bout de ans, € : on sort. Le programme affiche : il faut années. ⭐ C'est un algorithme de SEUIL : on ne sait pas d'avance combien de tours il faut, d'où le « while ». ⛔ Le piège : répondre ans, « € à € par an ». Les intérêts s'ajoutent aux intérêts : le capital grandit plus vite.n (années) c (€) 0 1 000 1 1 040 2 1 081,60 9 1 423,31 10 1 480,24 11 1 539,45 12
a) Écrire une fonction « est_multiple(a, b) » qui renvoie True si a est un multiple de b, et False sinon. b) Que renvoient « est_multiple(21, 7) » et « est_multiple(22, 7) » ? c) Quel est le type de ce qu'elle renvoie ?Voir la correction
a) a est un multiple de b quand le reste de la division de a par b est nul : « def est_multiple(a, b): » puis, en retrait, « return a % b == 0 ». b) : le reste est , elle renvoie True. : le reste est , elle renvoie False. c) Une comparaison vaut True ou False : la fonction renvoie un bool. ⭐ Pas besoin de « if » : la comparaison « a % b == 0 » EST déjà le résultat.def est_multiple(a, b):return a % b == 0est_multiple(21, 7) # Trueest_multiple(22, 7) # False13
Écrire un programme qui calcule et affiche la somme des carrés des entiers de à : . Quelle valeur affiche-t-il ?Voir la correction
On garde le schéma de l'exercice 7 : une variable s à , puis une boucle qui ajoute chaque carré. Les entiers de à : « range(1, 11) », car la borne de droite est exclue. À chaque tour, on ajoute « k ** 2 ». Le programme affiche . ⭐ Vérification : . ⛔ Le piège : « range(1, 10) », qui s'arrête à et oublie .s = 0for k in range(1, 11):s = s + k ** 2print(s)14
Voici l'algorithme de Syracuse : si n est pair, on le divise par ; sinon, on le multiplie par et on ajoute . On recommence jusqu'à obtenir . a) Qu'affiche le programme ? b) Que compte la variable etapes ?n = 6etapes = 0while n != 1:if n % 2 == 0:n = n // 2else:n = 3 * n + 1etapes = etapes + 1print(etapes)Voir la correction
a) On déroule : est pair → ; est impair → ; puis , , , , , . On a obtenu : « n != 1 » (n différent de ) est faux, on sort. Le programme affiche . b) etapes compte le nombre de transformations pour arriver à : ici . ⭐ Personne n'a jamais trouvé de nombre qui n'arrive pas à … mais personne n'a démontré que c'était toujours vrai : c'est la CONJECTURE de Syracuse, toujours ouverte. ⛔ Le piège : « n / 2 » au lieu de « n // 2 ». On obtiendrait des float, « 3.0 », « 5.0 »…étape n 0 6 1 3 2 10 3 5 4 16 5 8 6 4 7 2 8 1 15
Ce programme doit afficher l'âge de l'utilisateur l'an prochain. Il s'arrête sur une erreur. a) Pourquoi ? b) Corriger la première ligne.age = input('Âge ? ')print(age + 1)Voir la correction
a) « input » renvoie TOUJOURS un texte (str), même si l'on tape des chiffres : age vaut par exemple '15', entre guillemets. « age + 1 » demande d'ajouter un texte et un nombre : Python refuse (TypeError). b) On convertit le texte en entier dès la saisie : « age = int(input('Âge ? ')) ». Avec , le programme affiche . ⭐ Le type d'une variable n'est pas écrit dans le programme, mais il décide de ce qu'on peut en faire.age = int(input('Âge ? '))print(age + 1)16
a) Que renvoient « somme(4) » et « somme(100) » ? b) Comparer avec la formule .def somme(n):s = 0for k in range(n + 1):s = s + kreturn sVoir la correction
a) « range(n + 1) » donne k = , , …, . La fonction additionne donc les entiers de à . somme(4) : . somme(100) : . b) ✓ et ✓. ⭐ La boucle fait tours pour somme(100) ; la formule, un seul calcul. Le programme sert à VÉRIFIER une formule sur beaucoup de cas avant de la démontrer. ⛔ Le piège : « range(n) », qui s'arrête à et oublie le dernier terme.k s 0 0 1 1 2 3 3 6 4 10
Problèmes : exercices 17 à 20niveau 3
Des situations réelles : on lit le programme, on le fait tourner à la main, on interprète ce qu'il affiche.
Rappel de cours
- « from random import randint » puis « randint(1, 6) » : un entier au hasard entre et , bornes COMPRISES.
- Simuler, c'est répéter une expérience aléatoire un grand nombre de fois et compter : la fréquence obtenue s'approche de la probabilité.
- Un programme ne prouve rien d'un modèle : il calcule ce que le modèle PRÉVOIT.
17Le dé lancé dix mille fois
a) Que calcule la fonction « lancers(n) » ? b) Quelle valeur s'attend-on à trouver pour « lancers(10000) » ? c) Deux élèves lancent « lancers(10) » : l'un obtient 0.4, l'autre 0.0. L'un d'eux s'est-il trompé ?from random import randintdef lancers(n):six = 0for i in range(n):if randint(1, 6) == 6:six = six + 1return six / nVoir la correction
a) La boucle lance n fois un dé ; à chaque « 6 », on ajoute au compteur six. À la fin, on divise par n : la fonction renvoie la FRÉQUENCE des six sur n lancers. b) La probabilité d'un six est . Sur lancers, la fréquence est très proche de : c'est la loi des grands nombres. c) Personne ne s'est trompé. Sur lancers, obtenir six ou aucun est tout à fait possible : un petit échantillon FLUCTUE beaucoup. ⭐ Le diagramme montre un vrai essai : sur lancers, sur , sur . Plus n est grand, plus la fréquence se resserre autour de : c'est pour cela qu'on simule en grand.18Le CO₂ de l'atmosphère
À l'observatoire de Mauna Loa (Hawaï), la concentration moyenne de CO₂ dans l'air était d'environ ppm (parties par million) en 2024. On suppose qu'elle augmente de ppm par an. a) En quelle année le programme prévoit-il le passage des ppm ? b) Quel est le type de co2 à la fin ? Pourquoi ? c) Que faut-il changer pour une hausse de ppm par an ? Quelle année obtient-on alors ?co2 = 424annee = 2024while co2 < 450:co2 = co2 + 2.5annee = annee + 1print(annee)Voir la correction
a) Il faut monter de ppm. Au bout de ans, : encore sous . Au bout de ans, : on sort. Le programme affiche . b) co2 valait l'entier , mais on lui ajoute : il devient un float, « 451.5 ». c) On remplace « 2.5 » par « 3 ». Il faut alors ans () : le programme affiche . ⭐ Le modèle ne dit rien de l'avenir réel : il dit ce qui arrive SI la hausse reste constante. En 2024, elle a d'ailleurs été plus forte que ppm. ⛔ Le piège au a) : diviser, , et répondre 2034. On compte des années entières, et ans ne suffisent pas.annee co2 2024 424 2025 426.5 2033 446.5 2034 449.0 2035 451.5 19Deux dés : le 7 ou le 12 ?
On lance deux dés et on fait la somme. Ce programme compte, sur lancers, combien de fois on obtient et combien de fois . a) Compléter les deux lignes « if ». b) Quelles fréquences s'attend-on à trouver ? Justifier avec les issues possibles. c) Un joueur parie sur le « parce que c'est le plus gros ». A-t-il raison ?from random import randintsept = 0douze = 0for i in range(36000):d1 = randint(1, 6)d2 = randint(1, 6)s = d1 + d2if ...:sept = sept + 1if ...:douze = douze + 1print(sept, douze)Voir la correction
a) « if s == 7: » et « if s == 12: » (deux « = » pour comparer). b) Deux dés donnent issues équiprobables. La somme en compte : (1 ; 6), (2 ; 5), (3 ; 4), (4 ; 3), (5 ; 2), (6 ; 1). La somme une seule : (6 ; 6). On attend une fréquence proche de pour , soit environ fois ; et proche de pour , soit environ fois. c) Non : le sort environ SIX fois plus souvent. Toutes les sommes ne sont pas équiprobables, même si chaque dé l'est. ⛔ Le piège au b) : croire les onze sommes, de à , également probables. Ce sont les COUPLES qui le sont.20La racine de 2, pas à pas
On cherche sans la touche racine : on part de et on avance de tant que le carré reste sous . a) Faire la trace de x. Quel encadrement de obtient-on ? b) Python affiche en fait « 1.5000000000000004 ». Pourquoi pas « 1.5 » ? c) Que faut-il changer pour avoir un encadrement à près ? Python affiche alors « 1.4200000000000004 » : quel encadrement en déduit-on ?x = 1while x * x < 2:x = x + 0.1print(x)Voir la correction
a) x vaut , puis ; ; ; : leurs carrés, ; ; ; , sont sous . Avec , le carré vaut : on sort. , donc . b) L'ordinateur calcule en BINAIRE, où ne s'écrit pas exactement (comme en décimal). Chaque ajout garde une minuscule erreur, et elles s'accumulent : au lieu de . c) On remplace « 0.1 » par « 0.01 ». Le programme s'arrête au premier x dont le carré dépasse , soit (à l'erreur près) : . ⭐ C'est un algorithme de BALAYAGE : plus le pas est petit, plus l'encadrement est fin — et plus la boucle tourne. ⛔ Le piège au a) : répondre « ». Le programme donne la PREMIÈRE valeur trop grande : est juste avant.x x * x < 2 ? 1 1 oui 1.1 1.21 oui 1.2 1.44 oui 1.3 1.69 oui 1.4 1.96 oui 1.5 2.25 non