eleveai.frLa liberté d'apprendre
Maths1re spéFiche d'exercices

Algorithmique et programmation : 20 exercices corrigésmaths 1re spé — du geste seul au problème de contrôle

Vingt exercices, du geste seul au problème de contrôle : l'affectation simultanée, les listes (en extension, par ajouts, en compréhension), leurs indices et leur parcours, la fonction qui renvoie une valeur, la boucle de seuil sur une suite, la simulation d'un jeu. Des truites dans un lac, la pluie d'une semaine, une randonnée, deux plateformes qui se disputent des abonnés, la racine de 2 par la méthode de Newton. Chaque corrigé montre la trace du programme ou la liste dessinée case par case. Un rappel de cours avant chaque niveau.

Un seul geste : exercices 1 à 8niveau 1

Un programme par exercice : le suivre ligne à ligne, en notant les valeurs.

Rappel de cours

  • « a, b = b, a + b » est une affectation SIMULTANÉE : Python calcule d'abord les deux valeurs de droite, avec les anciennes valeurs, puis il les range.
  • Une LISTE s'écrit entre crochets : « L = [5, 8, 2] ». Les indices commencent à  : L[0] est le premier élément, L[-1] le dernier, len(L) le nombre d'éléments.
  • Trois façons de créer une liste : en EXTENSION « [3, 6, 9] » ; par AJOUTS avec « L.append(x) » dans une boucle ; en COMPRÉHENSION « [3*k for k in range(1, 4)] ».
  • Une fonction RENVOIE son résultat avec « return ». « print » l'affiche seulement : la fonction renvoie alors None, une valeur vide.
  1. 1

    On exécute « a, b = 1, 1 », puis trois fois la ligne « a, b = b, a + b ». a) Que valent a et b à la fin ? Faire la trace. b) Un élève remplace chaque ligne « a, b = b, a + b » par les deux lignes « a = b » puis « b = a + b ». Que valent alors a et b à la fin ?
    Voir la correction
    a) Dans « a, b = b, a + b », Python calcule D'ABORD les deux valeurs de droite avec les anciennes valeurs, puis il les range. Départ : a vaut et b vaut . 1er passage : a reçoit (l'ancien b), b reçoit . 2e passage : a reçoit , b reçoit . 3e passage : a reçoit , b reçoit . À la fin, a vaut et b vaut . On reconnaît les nombres de Fibonacci : , , , , … b) Avec deux lignes, « b = a + b » utilise le NOUVEAU a. 1er passage : a vaut , puis b vaut . 2e : a vaut , puis b vaut . 3e : a vaut , puis b vaut . À la fin, a vaut et b vaut  : ce n'est plus la même suite. ⛔ Le piège : croire que les deux écritures font la même chose. L'affectation simultanée évite d'écraser une valeur dont on a encore besoin.
    étapeab
    011
    112
    223
    335
  2. 2

    Voici trois façons de créer une liste L. A : « L = [3, 6, 9, 12] » B : « L = [] » puis « for k in range(4): L.append(3 * k) » C : « L = [3*k for k in range(1, 5)] » a) Donner la liste obtenue par chaque programme. b) Lesquels donnent la même liste ? Corriger celui qui diffère.
    Voir la correction
    a) A est écrite en EXTENSION : L vaut [3, 6, 9, 12]. B part d'une liste vide et AJOUTE à la fin, pour k = , , ,  : L vaut [0, 3, 6, 9]. C est écrite en COMPRÉHENSION, pour k = , , ,  : L vaut [3, 6, 9, 12]. b) A et C donnent la même liste ; B commence à . Pour corriger B, on fait partir k de  : « for k in range(1, 5): L.append(3 * k) ». ⛔ Le piège : « range(4) » commence à et s'arrête à . Il donne bien quatre valeurs, mais pas celles qu'on croit.
    A et C031629312B00132639
  3. 3

    On a créé la liste « L = [5, 8, 2, 9, 4] », dessinée ci-dessous avec ses indices. a) Que valent L[0], L[3], L[-1] et len(L) ? b) Que contient L après l'instruction « L[1] = 7 » ? c) Que se passe-t-il si l'on demande L[5] ?
    L0518223944
    Voir la correction
    a) Les indices commencent à  : L[0] est le PREMIER élément, . L[3] est le quatrième élément : . L[-1] est le DERNIER élément : . len(L) est le nombre d'éléments : . b) « L[1] = 7 » remplace l'élément d'indice , c'est-à-dire le deuxième : L devient [5, 7, 2, 9, 4]. c) Les indices vont de à  : L[5] n'existe pas. Python s'arrête sur une erreur (IndexError). ⛔ Le piège : croire que L[3] est le troisième élément. L'indice est toujours décalé de par rapport au rang.
    L après L[1] = 70517223944
  4. 4

    Voici les températures maximales d'une semaine de mai (en °C), rangées dans une liste T, et un programme. a) Faire la trace de x et de m. b) Qu'affiche le programme ? Que calcule-t-il ? c) Pourquoi part-on de « m = T[0] » plutôt que de « m = 0 » ? Penser à une semaine d'hiver très froide.
    T = [12, 15, 9, 17, 14]
    m = T[0]
    for x in T:
    if x > m:
    m = x
    print(m)
    Voir la correction
    a) « for x in T » donne à x chaque ÉLÉMENT de la liste, dans l'ordre : , , , , . m vaut d'abord . Avec , m devient . Avec , rien ne change. Avec , m devient . Avec , rien ne change. b) Le programme affiche  : c'est le MAXIMUM de la liste. c) Si toutes les températures sont négatives, par exemple [-8, -3, -11], « m = 0 » donnerait , qui n'est même pas dans la liste. En partant de T[0], m est toujours une vraie valeur de la liste. ⭐ Pour trouver le minimum, on garde le même programme et on remplace « > » par « < ».
    xx > m ?m
    12non12
    15oui15
    9non15
    17oui17
    14non17
  5. 5

    La suite est définie par et . On exécute « u = 5 », puis « for k in range(4): u = 2 * u - 3 ». a) Faire la trace de k et de u. b) Quel terme de la suite u contient-il à la fin ?
    Voir la correction
    a) « range(4) » donne k = , , ,  : la boucle fait tours. À chaque tour, u est remplacé par  : , puis , puis , puis . b) Au départ, u contient  ; après un tour,  ; après tours, . À la fin, u vaut . ⛔ Le piège : répondre , parce que le dernier k vaut . Ce qui compte, c'est le NOMBRE de tours : tours font avancer de rangs.
    u = 5
    for k in range(4):
    u = 2 * u - 3
    print(u)
    ku après le tourterme
    07u₁
    111u₂
    219u₃
    335u₄
  6. 6

    Cette fonction dit combien de racines réelles a le trinôme . a) Que renvoient nb_racines(1, -2, 1), nb_racines(2, 3, -5) et nb_racines(1, 1, 1) ? b) Pourquoi écrit-on « == » à la ligne 5, et non « = » ?
    def nb_racines(a, b, c):
    d = b**2 - 4*a*c
    if d > 0:
    return 2
    elif d == 0:
    return 1
    else:
    return 0
    Voir la correction
    a) La fonction calcule le discriminant d, puis teste les cas DANS L'ORDRE et renvoie le premier qui convient. nb_racines(1, -2, 1) : . « d > 0 » est faux, « d == 0 » est vrai : elle renvoie . nb_racines(2, 3, -5) :  : elle renvoie . nb_racines(1, 1, 1) : . Les deux tests sont faux : on arrive au « else », elle renvoie . b) « == » COMPARE deux valeurs et donne True ou False. « = » RANGE une valeur : dans un « if », Python refuserait la ligne. ⭐ Dès qu'un « return » est exécuté, la fonction s'arrête : les lignes suivantes ne sont pas lues.
    appeldrenvoie
    (1, −2, 1)01
    (2, 3, −5)492
    (1, 1, 1)−30
  7. 7

    On exécute « n = 0 », « s = 0 », puis « while s <= 30: » suivi, en retrait, des deux lignes « n = n + 1 » et « s = s + n ». On affiche enfin n et s. a) Faire la trace de n et de s. b) Qu'affiche le programme ? Traduire le résultat par une phrase sur la somme .
    Voir la correction
    a) On teste la condition AVANT chaque tour : on continue tant que s est inférieur ou égal à . n vaut , , … et s ajoute n à chaque tour : , , , , , , . Avec s = , la condition « 28 <= 30 » est vraie : encore un tour. n devient et s devient . Maintenant « 36 <= 30 » est faux : on sort. b) Le programme affiche « 8 36 ». Phrase : est le plus petit entier n tel que  ; cette somme vaut alors . ⛔ Le piège : s'arrêter à , « la dernière somme sous  ». La boucle s'arrête quand la condition devient FAUSSE, donc juste APRÈS avoir dépassé .
    n = 0
    s = 0
    while s <= 30:
    n = n + 1
    s = s + n
    print(n, s)
    tourns
    111
    223
    336
    4410
    5515
    6621
    7728
    8836
  8. 8

    Voici deux fonctions presque identiques. a) Que vaut « f(4) » ? b) On exécute « y = f(4) + 1 ». Que vaut y ? c) On exécute « z = g(4) + 1 ». Le programme affiche , puis s'arrête sur une erreur. Expliquer.
    def f(x):
    return x**2 - 3*x + 1
    def g(x):
    print(x**2 - 3*x + 1)
    Voir la correction
    a) . b) f RENVOIE son résultat : « f(4) » vaut , qu'on peut réutiliser dans un calcul. y vaut . c) g AFFICHE le nombre à l'écran, mais ne renvoie rien : en Python, « g(4) » vaut None, une valeur vide. « None + 1 » n'a pas de sens : Python s'arrête (TypeError). ⭐ « print » montre un résultat à l'humain ; « return » le donne au programme. Une fonction mathématique se programme avec « return ». ⛔ Le piège : croire que g fait comme f parce qu'on voit « 5 » à l'écran.
    appelafficherenvoie
    f(4)rien5
    g(4)5None

Type devoir : exercices 9 à 16niveau 2

Plusieurs étapes, comme au contrôle : lire un programme, le faire tourner à la main, en écrire un morceau.

Rappel de cours

  • Parcourir une liste : « for x in L » donne les ÉLÉMENTS ; « for i in range(len(L)) » donne les INDICES, et L[i] l'élément d'indice i.
  • Recherche de SEUIL : « while u <= S » répète tant que le seuil S n'est pas dépassé. Le compteur n donne, à la sortie, le premier rang où il l'est.
  • Une fonction peut en appeler une autre : on découpe un problème en petites fonctions, chacune facile à tester.
  • Les nombres à virgule (float) sont arrondis en binaire : « 0.1 » n'est pas exact en machine, et les petites erreurs s'accumulent.
  1. 9

    La suite est définie par et . Programme A : « u = 1 », « L = [u] », puis « for n in range(5): » suivi, en retrait, de « u = u + n » et « L.append(u) ». Programme B : « M = [1 + n*(n-1)//2 for n in range(6)] ». a) Faire la trace du programme A. Que contient L à la fin ? b) Que contient M ? Qu'est-ce que cela suggère ? c) Placer les termes dans un repère. La suite est-elle arithmétique ?
    Voir la correction
    a) L commence avec . À chaque tour, on calcule le terme suivant, puis on l'AJOUTE à la fin de L. n =  : u devient . n =  : . n =  : . n =  : . n =  : . L vaut [1, 1, 2, 4, 7, 11] : ce sont , …, , soit six termes pour cinq tours. b) M est écrite en compréhension : pour n de à , on calcule (« // » est la division entière, sans perte ici car est toujours pair). M vaut aussi [1, 1, 2, 4, 7, 11]. Les deux listes coïncident : on peut CONJECTURER que pour tout n. Six termes ne le démontrent pas, mais le rendent plausible. c) Les points ne sont pas alignés : la suite n'est pas arithmétique (les écarts , , , , ne sont pas constants). Ils sont sur la parabole . ⛔ Le piège : oublier que L contient déjà avant la boucle. Cinq tours donnent six termes.
    L (l'indice est le rang n)0111223447511
    -101234561234567891012
  2. 10

    La liste mm contient la pluie tombée chaque jour d'une semaine, en millimètres. a) Que renvoie « jours_secs(mm) » ? Que compte la fonction ? b) Écrire une fonction « moyenne(L) » qui renvoie la moyenne des éléments de L, en parcourant la liste avec une boucle. c) Que renvoie « moyenne(mm) » ?
    mm = [0, 12, 3, 0, 25, 9, 0]
    def jours_secs(L):
    n = 0
    for x in L:
    if x == 0:
    n = n + 1
    return n
    Voir la correction
    a) La boucle parcourt les ÉLÉMENTS de la liste. À chaque jour sans pluie (x == 0), le compteur n augmente de . Les jours à mm sont le 1er, le 4e et le 7e : la fonction renvoie . Elle compte les jours SECS. b) On additionne les éléments dans une variable s, puis on divise par le nombre d'éléments, len(L) : voir le programme. c) et len(mm) vaut  : « moyenne(mm) » renvoie « 7.0 », soit mm par jour en moyenne. ⭐ « 7.0 » et non « 7 » : la division « / » donne toujours un float. ⛔ Le piège au b) : diviser par écrit à la main. Avec « len(L) », la fonction marche pour une liste de n'importe quelle longueur.
    def moyenne(L):
    s = 0
    for x in L:
    s = s + x
    return s / len(L)
  3. 11

    Sur une randonnée, un GPS relève l'altitude (en m) tous les deux kilomètres : « alt = [320, 450, 610, 580, 720] ». a) Que contient la liste « e = [alt[i+1] - alt[i] for i in range(len(alt) - 1)] » ? Que représente-t-elle ? b) Le DÉNIVELÉ POSITIF est la somme des montées. Le calculer à partir de e. c) Pourquoi « range(len(alt) - 1) », et pas « range(len(alt)) » ?
    Voir la correction
    a) len(alt) vaut , donc « range(4) » : i prend les valeurs , , , . Pour chaque i, on calcule l'écart entre deux relevés voisins :  ;  ;  ; . e vaut [130, 160, -30, 140] : ce sont les VARIATIONS d'altitude sur chaque tronçon de km. Le est une descente. b) On ajoute les écarts positifs : m. ⚠️ Ce n'est pas m : la descente de m a dû être remontée. c) Avec « range(5) », le dernier tour prendrait i = et demanderait alt[5], qui n'existe pas : erreur IndexError. Cinq relevés donnent seulement quatre écarts. ⛔ Le piège : oublier qu'une liste de n éléments a ses indices de à .
    alt03201450261035804720e013011602−303140
  4. 12

    Dans un lac, on modélise le nombre de truites (en milliers) par la suite et  : chaque année, % des truites disparaissent et l'on en réintroduit . a) Qu'affiche le programme ? Interpréter. b) Que se passerait-il si l'on remplaçait par dans la condition du « while » ?
    u = 1
    n = 0
    while u <= 7:
    u = 0.6 * u + 3
    n = n + 1
    print(n)
    Voir la correction
    a) On calcule les termes tant qu'ils ne dépassent pas  :  ;  ;  ;  ;  ; . est encore inférieur ou égal à  : un tour de plus.  : on sort. Le programme affiche . Interprétation : c'est au bout de ans que le lac compte, pour la première fois, plus de truites. b) Les termes montent vers sans jamais le dépasser : si , alors . Donc u reste toujours sous  : la condition « u <= 8 » reste vraie, et la boucle ne s'arrête JAMAIS. ⛔ Le piège : lancer une recherche de seuil sans vérifier que le seuil peut être atteint. Sur le dessin, les points franchissent la droite , mais se tassent bien sous la droite .
    -101357912345679
  5. 13

    Pour approcher le nombre dérivé de en , on calcule des pentes de sécantes de plus en plus proches. a) Que calcule « taux(a, h) » ? Pourquoi cette fonction appelle-t-elle f ? b) Python affiche « [3.0, 2.100000000000002, 2.0100000000000007] ». Retrouver ces valeurs par le calcul, et expliquer les derniers chiffres. c) Quelle valeur de ces pentes suggèrent-elles ?
    def f(x):
    return x**2
    def taux(a, h):
    d = f(a + h) - f(a)
    return d / h
    L = [taux(1, h) for h in
    [1, 0.1, 0.01]]
    print(L)
    Voir la correction
    a) « taux(a, h) » calcule  : la pente de la sécante qui joint les points de la courbe d'abscisses et . Elle appelle f au lieu de recopier la formule : pour changer de fonction, on ne modifie QUE f. C'est l'intérêt de découper en fonctions. b) . Pour  :  ; pour  :  ; pour  : . Les derniers chiffres de « 2.100000000000002 » viennent des arrondis du calcul en binaire : ne s'écrit pas exactement en machine. c) Les pentes se rapprochent de quand h rétrécit : on conjecture , ce que confirme la formule . ⭐ Sur le dessin : la sécante pour (en vert, pente ) pivote autour du point vers la tangente (en orange, pente ).
    -10123-2-112345
  6. 14

    Une population de bactéries y vérifie et  : sa vitesse de croissance est égale à sa taille. La méthode d'Euler avance à petits pas h en suivant la tangente : . a) Faire la trace du programme. Qu'affiche-t-il ? b) Comparer avec la valeur exacte . Comment améliorer l'approximation ? c) Avec « h = 0.1 », la boucle tourne fois au lieu de . Pourquoi ?
    x = 0
    y = 1
    h = 0.25
    while x < 1:
    y = y + h * y
    x = x + h
    print(y)
    Voir la correction
    a) À chaque tour, y est multiplié par et x avance de . x :  ;  ;  ; . y :  ;  ;  ; . Avec x = , « 1 < 1 » est faux : on sort après tours. Le programme affiche . b) Euler donne une valeur trop petite : la courbe s'incurve vers le haut, et les segments de tangente restent en dessous. Pour faire mieux, on diminue le pas h : plus de tours, mais des segments plus courts, qui collent mieux à la courbe. c) En machine, n'est pas exact. Après dix ajouts, x vaut , un peu moins que  : « x < 1 » est encore vrai, et la boucle fait un e tour. Le programme affiche alors au lieu de . ⛔ Le piège : arrêter une boucle sur une comparaison de float. Plus sûr : compter les tours, avec « for k in range(10) ».
    tourxy
    10.251.25
    20.51.5625
    30.751.953125
    412.44140625
    -1012-1123
  7. 15

    On veut la liste des nombres premiers inférieurs à . Un nombre premier a exactement deux diviseurs : et lui-même. a) Que renvoie « diviseurs(12) » ? b) Que renvoient « est_premier(13) » et « est_premier(1) » ? c) Que contient la liste P ?
    def diviseurs(n):
    L = []
    for d in range(1, n + 1):
    if n % d == 0:
    L.append(d)
    return L
    def est_premier(n):
    k = len(diviseurs(n))
    return k == 2
    P = [n for n in range(20)
    if est_premier(n)]
    Voir la correction
    a) diviseurs(n) parcourt d de à n (« range(1, n + 1) », car la borne de droite est exclue) et AJOUTE d à L quand le reste « n % d » est nul. diviseurs(12) renvoie [1, 2, 3, 4, 6, 12]. b) est_premier APPELLE diviseurs et compte les diviseurs obtenus. en a deux, [1, 13] : True. n'en a qu'un, [1] : False. C'est voulu : n'est pas un nombre premier. c) P garde les n de à pour lesquels est_premier(n) est vrai : P vaut [2, 3, 5, 7, 11, 13, 17, 19]. est écarté aussi : diviseurs(0) est la liste vide, qui a élément. ⭐ Deux petites fonctions, chacune facile à tester, font un programme sûr : c'est le découpage en fonctions. ⛔ Le piège au a) : « range(1, n) », qui oublie n lui-même. Alors n'aurait qu'un diviseur et ne serait plus premier.
    diviseurs(12)0112233446512P02132537411513617719
  8. 16

    Un escargot parcourt m la première heure, puis, chaque heure, la moitié de la distance de l'heure précédente. On exécute « S = 0 », « u = 1 », puis « for k in range(5): » suivi, en retrait, de « S = S + u » et « u = u / 2 ». a) Faire la trace de S et de u. Que vaut S à la fin ? Que représente-t-il ? b) Un élève inverse les deux lignes de la boucle. Que vaut alors S ? c) L'escargot atteindra-t-il m ?
    Voir la correction
    a) u est la distance parcourue pendant l'heure en cours ; S additionne ces distances. Tour 1 : S reçoit , puis u devient . Tour 2 : S vaut , u vaut . Puis S vaut  ;  ; . À la fin, S vaut  : la distance totale parcourue en heures, en mètres. b) Si l'on divise u par AVANT de l'ajouter, la première heure compte pour  : S vaut . C'est faux : l'ordre des lignes dans une boucle compte. c) Après chaque heure, il manque exactement la distance de l'heure qui vient de s'écouler : . L'escargot s'approche de m, sans jamais les atteindre. ⭐ Ici, tous les calculs sont exacts en machine : , … s'écrivent parfaitement en binaire.
    S = 0
    u = 1
    for k in range(5):
    S = S + u
    u = u / 2
    print(S)
    kSu après
    010.5
    11.50.25
    21.750.125
    31.8750.0625
    41.93750.03125

Problèmes : exercices 17 à 20niveau 3

Des situations complètes : on lit le programme, on le fait tourner à la main, on interprète ce qu'il affiche.

Rappel de cours

  • Un programme se lit en trois temps : ce que contiennent les variables au départ, ce que fait UN tour de boucle, quand on s'arrête.
  • « from random import randint » puis « randint(1, 6) » : un entier au hasard entre et , bornes COMPRISES. La moyenne des gains sur un grand nombre de parties approche l'espérance.
  • Une suite se programme par sa relation de récurrence : une variable u, remplacée à chaque tour par le terme suivant. Pour garder tous les termes, on les ajoute à une liste.
  1. 17Le jeu de dé de la fête

    À une fête de village, on lance un dé. Avec un , on gagne € ; avec un ou un , on gagne € ; sinon, on perd €. a) Le gain d'une partie est une variable aléatoire . Donner sa loi et calculer son espérance. b) Que renvoie « partie() » ? Que calcule « moyenne(N) » ? c) Un essai a donné : « moyenne(10) » renvoie « -0.8 », « moyenne(100) » renvoie « 0.0 », « moyenne(10000) » renvoie « 0.1703 ». Commenter. d) Le jeu est-il favorable au joueur ?
    from random import randint
    def partie():
    d = randint(1, 6)
    if d == 6:
    return 5
    elif d >= 4:
    return 1
    else:
    return -2
    def moyenne(N):
    L = [partie()
    for k in range(N)]
    return sum(L) / N
    Voir la correction
    a)  ;  ; . €. b) « partie() » tire un dé et RENVOIE le gain d'une partie : , ou , avec les probabilités de la loi de . « moyenne(N) » APPELLE partie() N fois, range les N gains dans la liste L (en compréhension), puis renvoie leur moyenne : le gain moyen sur N parties. c) Sur parties, on a perdu en moyenne € par partie ; sur , on n'a rien gagné. Sur parties, le gain moyen vaut €, très proche de . Plus N est grand, plus la moyenne se rapproche de l'espérance : c'est la loi des grands nombres. d)  : en moyenne, le joueur gagne environ centimes par partie. Le jeu lui est légèrement favorable, et fera perdre de l'argent à l'organisateur sur un grand nombre de parties. ⛔ Le piège : juger le jeu sur parties. Un petit nombre de parties fluctue beaucoup : ici, il faisait croire à un jeu perdant.
    Nmoyenne(N)
    10-0.8
    1000
    100000.1703
  2. 18Qui aura le plus d'abonnés ?

    Deux plateformes lancent leur service le même mois. On modélise leurs abonnés, en milliers : A part de et gagne par mois ; B part de et augmente de % par mois. On note et ces nombres au bout de n mois. a) Exprimer et en fonction de . b) Qu'affiche le programme ? Interpréter. c) Pourquoi la condition est-elle « b <= a », et pas « b < a » ? d) Modifier le programme pour qu'il range aussi les valeurs successives de b dans une liste LB.
    a = 5
    b = 1
    n = 0
    while b <= a:
    a = a + 0.5
    b = b * 1.25
    n = n + 1
    print(n)
    Voir la correction
    a) A gagne la même quantité chaque mois : suite arithmétique, . B est multipliée par chaque mois : suite géométrique, . b) La boucle tourne tant que B n'a pas dépassé A. Au bout de mois : et . Au bout de mois : et  : on sort. Le programme affiche  : B dépasse A au bout de mois, avec environ abonnés contre . c) On veut le premier mois où B a STRICTEMENT plus d'abonnés que A. Avec « b < a », une égalité arrêterait la boucle trop tôt (ici, elle ne se produit pas). d) Avant la boucle, « LB = [b] » ; dans la boucle, après « b = b * 1.25 », on ajoute « LB.append(b) ». À la fin, LB contient , …,  : douze valeurs. ⭐ Une croissance en pourcentage finit toujours par dépasser une croissance constante : sur le dessin, la ligne orange de B finit par croiser la droite de A.
    -101357911123456789101113
  3. 19Les kilomètres d'une course

    Une coureuse chronomètre chaque kilomètre d'une course de km. Les temps, en secondes, sont rangés dans la liste T. a) Que renvoie « plus_rapide(T) » ? Quel kilomètre a-t-elle couru le plus vite ? b) Que contient la liste C à la fin ? Que représente C[-1] ? c) Calculer son allure moyenne, en minutes par kilomètre.
    T = [312, 305, 298, 301, 284]
    def plus_rapide(T):
    i_min = 0
    for i in range(len(T)):
    if T[i] < T[i_min]:
    i_min = i
    return i_min
    C = [T[0]]
    for i in range(1, len(T)):
    C.append(C[-1] + T[i])
    Voir la correction
    a) La fonction parcourt les INDICES i de à et retient dans i_min l'indice du plus petit temps rencontré. T[4] = est le plus petit : « plus_rapide(T) » renvoie . L'indice correspond au 5e kilomètre, le dernier, couru en s, soit min s. ⛔ Le piège : répondre « le 4e kilomètre ». L'indice commence à  : l'indice est le 5e élément. b) C commence par T[0] =  ; chaque tour ajoute à la fin le dernier total, C[-1], plus le temps suivant. C vaut [312, 617, 915, 1216, 1500] : les temps CUMULÉS au passage de chaque kilomètre. C[-1] = s est le temps total de la course : minutes. c) Allure moyenne : s par kilomètre, soit min par kilomètre. ⭐ Elle a fini plus vite qu'elle n'a commencé : son dernier kilomètre est le plus rapide.
    T03121305229833014284C0312161729153121641500
  4. 20La racine de 2 par la méthode de Newton

    On cherche la solution positive de , c'est-à-dire . On part de et, à chaque étape, on remplace x par l'abscisse du point où la tangente à la courbe de coupe l'axe des abscisses : . a) Écrire l'équation de la tangente en et retrouver . b) Expliquer le rôle de fp et de la liste L. Pour « newton(1, 4) », Python affiche « [1, 1.5, 1.4166666666666667, 1.4142156862745099, 1.4142135623746899] » : vérifier par le calcul. c) Sachant que , combien de décimales justes a chaque terme ? Que remarque-t-on ?
    def f(x):
    return x**2 - 2
    def fp(x):
    return 2*x
    def newton(x, n):
    L = [x]
    for k in range(n):
    x = x - f(x) / fp(x)
    L.append(x)
    return L
    Voir la correction
    a) et , donc . Tangente : . Elle coupe l'axe des abscisses quand  : . C'est bien . b) fp est la dérivée . newton APPELLE f et fp à chaque étape, et range chaque nouvelle valeur dans L : la liste garde tous les termes, de à . . c)  : aucune décimale juste.  : décimales.  : décimales.  : décimales. Le nombre de décimales justes double à peu près à chaque étape : la méthode est très rapide. ⭐ Pour , ce calcul est celui qu'on attribue à Héron d'Alexandrie (Ier siècle) ; la méthode générale porte le nom de Newton (XVIIᵉ siècle).
    -10123-3-2-11234
eleveai.fr - Fiche d'exercicesAlgorithmique et programmation - 1re spé

Tu as compris ? À toi de t'entraîner :

🧮 Entraîne-toi avec le Coach Maths →