Aller au contenu principal
Seconde

Algorithmique et programmation en Python — Exercices d'application

1. Variables, types et affectation

↩ Revoir le cours

Exercice 1 — ⭐

  1. Donne le type de chacune des valeurs : 12, 12.0, "12", 12 > 5, 12 / 4.
  2. Calcule 17 // 5, 17 % 5 et 2 ** 5.
  3. Quelles sont les valeurs de x et y après ces instructions ?
    x = 3
    y = 8
    t = x
    x = y
    y = t
    À quoi sert la variable t ?
Voir le corrigé
  1. int, float, str, bool, float (une division / donne toujours un flottant : 3.0).
  2. 17 // 5 vaut 3, 17 % 5 vaut 2 (car 17=5×3+217 = 5 \times 3 + 2), 2 ** 5 vaut 32.
  3. x vaut 8 et y vaut 3 : les valeurs ont été échangées. La variable t sert à garder l’ancienne valeur de x, qui serait sinon perdue à la ligne x = y.

2. Instructions conditionnelles

↩ Revoir le cours

Exercice 2 — ⭐⭐

On reprend la fonction mention du cours.

  1. Que renvoient mention(17), mention(13.5) et mention(9.99) ?
  2. Un élève écrit la version ci-dessous. Que renvoie mention2(17) ? Explique l’erreur.
    def mention2(note):
        if note >= 10:
            return "Passable"
        elif note >= 16:
            return "Très bien"
        else:
            return "Insuffisant"
Voir le corrigé
  1. "Très bien", "Assez bien", "Insuffisant".
  2. mention2(17) renvoie "Passable" : la première condition 17 >= 10 est vraie, donc Python exécute ce bloc et ne teste jamais note >= 16. Il faut tester les conditions de la plus exigeante à la moins exigeante.

Exercice 3 — ⭐⭐

Une année est bissextile si elle est divisible par 44 mais pas par 100100, ou si elle est divisible par 400400.

  1. Les années 20242024, 20262026, 19001900 et 20002000 sont-elles bissextiles ?
  2. Explique le rôle de annee % 4 == 0 dans la fonction est_bissextile du cours.
  3. Écris une fonction nb_jours(annee) qui renvoie le nombre de jours de l’année (365365 ou 366366), en utilisant est_bissextile.
Voir le corrigé
  1. 20242024 : oui. 20262026 : non (pas divisible par 44). 19001900 : non (divisible par 100100 mais pas par 400400). 20002000 : oui (divisible par 400400).
  2. annee % 4 est le reste de la division de annee par 44 ; il vaut 00 exactement quand l’année est divisible par 44. C’est un booléen.
  3. def nb_jours(annee):
        if est_bissextile(annee):
            return 366
        else:
            return 365

3. Boucles bornées

↩ Revoir le cours

Exercice 4 — ⭐

  1. Quelles valeurs parcourent range(5), range(2, 7) et range(0, 20, 5) ?
  2. Écris un programme qui calcule la somme 12+22+⋯+1021^2 + 2^2 + \cdots + 10^2. Quelle valeur obtiens-tu ?
  3. Écris une boucle qui affiche la table de multiplication de 77 (de 7×17 \times 1 à 7×107 \times 10).
Voir le corrigé
  1. 0, 1, 2, 3, 4 ; 2, 3, 4, 5, 6 ; 0, 5, 10, 15.
  2. s = 0
    for k in range(1, 11):
        s = s + k**2
    On obtient 385385.
  3. for k in range(1, 11):
        print(7, "x", k, "=", 7 * k)

Exercice 5 — ⭐⭐

  1. La factorielle de nn est n!=1×2×⋯×nn! = 1 \times 2 \times \cdots \times n. Écris une fonction factorielle(n) avec une boucle for. Vérifie que factorielle(5) renvoie 120.
  2. Un capital de 1 0001\,000 € est placé à 2 %2\,\% par an. Écris une boucle qui calcule le capital au bout de 1010 ans. Quel calcul direct aurait-on pu faire ?
Voir le corrigé
  1. def factorielle(n):
        r = 1
        for k in range(1, n + 1):
            r = r * k
        return r
    L’accumulateur d’un produit s’initialise à 11 (et non à 00). factorielle(5) renvoie 1×2×3×4×5=1201 \times 2 \times 3 \times 4 \times 5 = 120.
  2. c = 1000
    for i in range(10):
        c = c * 1.02
    On obtient environ 1 218,991\,218{,}99 €. Calcul direct : 1 000×1,02101\,000 \times 1{,}02^{10}.

4. Boucles non bornées

↩ Revoir le cours

Exercice 6 — ⭐⭐

On cherche le plus petit entier nn tel que 1+2+⋯+n>1 0001 + 2 + \cdots + n > 1\,000.

  1. Complète la fonction :
    def seuil_somme(M):
        s = 0
        n = 0
        while ...:
            n = n + 1
            s = s + n
        return n
  2. Que renvoie seuil_somme(1000) ? Vérifie avec la formule 1+2+⋯+n=n(n+1)21 + 2 + \cdots + n = \dfrac{n(n+1)}{2}.
Voir le corrigé
  1. On continue tant que la somme n’a pas dépassé MM : while s <= M:.
  2. La fonction renvoie 45. Vérification : 44×452=990⩽1 000\dfrac{44 \times 45}{2} = 990 \leqslant 1\,000 et 45×462=1 035>1 000\dfrac{45 \times 46}{2} = 1\,035 > 1\,000.

Exercice 7 — ⭐⭐

On considère le programme :

x = 100
n = 0
while x > 1:
    x = x / 2
    n = n + 1
  1. Fais-le tourner à la main en notant les valeurs successives de x et n.
  2. Quelles sont les valeurs de x et de n à la fin ? Interprète n.
  3. Que se passerait-il si l’on remplaçait x = x / 2 par x = x * 2 ?
Voir le corrigé
  1. x : 100→50→25→12,5→6,25→3,125→1,5625→0,78125100 \to 50 \to 25 \to 12{,}5 \to 6{,}25 \to 3{,}125 \to 1{,}5625 \to 0{,}78125 ; n : 0→1→⋯→70 \to 1 \to \cdots \to 7.
  2. x vaut 0,781250{,}78125 et n vaut 77 : il faut diviser 77 fois 100100 par 22 pour passer sous 11 (car 26=64<100<128=272^6 = 64 < 100 < 128 = 2^7).
  3. x augmenterait sans cesse : la condition x > 1 resterait toujours vraie, et la boucle ne s’arrêterait jamais (boucle infinie).

5. Fonctions

↩ Revoir le cours

Exercice 8 — ⭐⭐⭐

La suite de Syracuse d’un entier n⩾1n \geqslant 1 : si nn est pair, on le divise par 22 ; sinon, on le remplace par 3n+13n + 1. On recommence jusqu’à obtenir 11.

  1. Écris la suite obtenue à partir de n=6n = 6.
  2. Écris une fonction syracuse(n) qui renvoie le nombre d’étapes nécessaires pour atteindre 11.
  3. Que renvoie syracuse(6) ? Et syracuse(7) ?
Voir le corrigé
  1. 6→3→10→5→16→8→4→2→16 \to 3 \to 10 \to 5 \to 16 \to 8 \to 4 \to 2 \to 1.
  2. def syracuse(n):
        etapes = 0
        while n != 1:
            if n % 2 == 0:
                n = n // 2
            else:
                n = 3 * n + 1
            etapes = etapes + 1
        return etapes
  3. syracuse(6) renvoie 8 (on compte les flèches de la question 1). syracuse(7) renvoie 16. (Personne n’a jamais démontré que cette boucle s’arrête pour tout entier nn : c’est un problème ouvert célèbre !)

6. Fonctions et hasard

↩ Revoir le cours

Exercice 9 — ⭐⭐

  1. Écris une fonction somme_deux_des() qui renvoie la somme de deux dés équilibrés.
  2. Écris une fonction frequence_sept(N) qui simule NN lancers de deux dés et renvoie la fréquence de la somme 77.
  3. Autour de quelle valeur les résultats de frequence_sept(10000) devraient-ils se situer ? Justifie avec le tableau des sommes.
Voir le corrigé
  1. from random import randint
    
    def somme_deux_des():
        return randint(1, 6) + randint(1, 6)
    (Attention : randint(2, 12) ne convient pas, car les sommes ne sont pas équiprobables.)
  2. def frequence_sept(N):
        compteur = 0
        for i in range(N):
            if somme_deux_des() == 7:
                compteur = compteur + 1
        return compteur / N
  3. La somme 77 correspond à 66 cases sur 3636 : P=16≈0,167P = \dfrac16 \approx 0{,}167. Les fréquences obtenues (par exemple 0,16860{,}1686) varient d’une exécution à l’autre, autour de cette valeur.