2de · Du modèle à l’autonomie
Observe un exemple expliqué, entraîne-toi avec des indices, puis résous une autre situation sur papier. Compare les étapes avant de faire le point.
Prévois les valeurs finales, puis explique pourquoi la première valeur de y ne change pas toute seule.
y
Les états sont \((x,y)=(2,\text{non définie})\), puis \((2,2)\), puis \((5,2)\). Enfin
À réessayer : déplace la ligne y = x après x = x + 3. Retrouve \(z=10\) et explique le changement.
y = x
x = x + 3
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, nom et test.
a
b
nom
test
Donne les valeurs finales de a, b, nom et test.
Explique pourquoi la dernière valeur de b est un flottant.
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.
x
Pour \(n\) entier strictement positif, la fonction suivante renvoie la moyenne des entiers de \(1\) à \(n\) par une méthode inhabituelle :
def moyenne_entiers(n): somme = 0 for k in range(1, n): somme = somme + k return somme / n + 1
Calcule le résultat pour \(n=3\) puis \(n=4\) et compare aux moyennes attendues.
Explique pourquoi ne pas ajouter \(n\) dans la boucle, puis ajouter \(1\) après la division, conserve le résultat.
Propose une autre version qui additionne tous les entiers avant de diviser.
Démontre que le résultat renvoyé vaut \((n+1)/2\).
Liste les valeurs de range(2, 9, 3), range(5, 2, -1) et range(3, 3). Pourquoi range(1, 5, 0) est-il refusé ?
range(2, 9, 3)
range(5, 2, -1)
range(3, 3)
range(1, 5, 0)
Les valeurs sont \(2,5,8\), puis \(5,4,3\), puis aucune. Le pas \(0\) provoque une erreur. Dans une boucle sans tour, le corps ne s’exécute pas : une variable créée seulement dedans peut rester non définie. À réessayer : écris un range donnant \(8,6,4,2\).
range
Donne, sans ordinateur, toutes les valeurs successives de k et le nombre de tours pour :
k
range(4) ;
range(4)
range(3, 8) ;
range(3, 8)
range(2, 13, 3) ;
range(2, 13, 3)
range(10, 3, -2).
range(10, 3, -2)
Puis indique ce qu'affiche :
for k in range(1, 6): print(2 * k)
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.
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\).
est_premier(n)
True
Utilise premier_carre_superieur avec un seuil de \(25\). Pourquoi faut-il renvoyer \(6\) et non \(5\) ? Que renvoie la fonction pour le seuil \(0\) ?
premier_carre_superieur
La boucle doit encore passer de \(5\) à \(6\) ; alors \(36>25\). Pour le seuil \(0\), le premier test \(0\leqslant0\) est vrai et l’on renvoie \(1\). À réessayer : écris la condition permettant de chercher le premier carré supérieur ou égal ; pour le seuil \(25\), le résultat devient \(5\).
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 mois et encadre le capital final au centime.
mois
Complète les quatre zones :
from fractions import Fraction def racine3(epsilon): if epsilon <= 0: raise ValueError("precision positive attendue") a = Fraction(1) b = Fraction(2) 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.
On considère :
def pgcd(a, b): while b != 0: a, b = b, a % b return a
Construis la table de trace pour pgcd(252, 105).
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.
La recherche et les corrigés restent accessibles ici. JavaScript permet de mémoriser ton autoévaluation.