Afficher le corrigé
Moon Arrows Sun
Arrows

Problèmes d'algorithmique

Trois programmes à lire, à corriger ou à écrire - sur une suite, sur une série de relevés, sur un tableau de valeurs. Dans les trois cas, la question mathématique précède la question informatique : c'est elle qui dicte la structure du programme.

Le seuil de population

Une population de \(1 \ 200\) individus augmente de \(4 \ \%\) par an. On cherche l'année où elle dépassera \(2 \ 000\).

  1. Écrire la relation de récurrence liant \(u_{n+1}\) à \(u_n\).
    $$ u_{n+1} = 1{,}04 \, u_n \qquad u_0 = 1 \ 200 $$
  2. Compléter ce programme pour qu'il affiche le nombre d'années nécessaires.
    u = ...
    n = 0
    while u <= ... :
        u = ...
        n = n + 1
    print(n)
    u = 1200
    n = 0
    while u <= 2000:
        u = 1.04 * u
        n = n + 1
    print(n)
  3. Le programme affiche \(14\). Vérifier par un calcul.
    $$ u_{13} = 1 \ 200 \times 1{,}04^{13} \approx 1 \ 998 $$
    $$ u_{14} = 1 \ 200 \times 1{,}04^{14} \approx 2 \ 078 $$
    $$ \text{le seuil est franchi la } 14^{\text{ème}} \text{ année} $$
  4. Pourquoi une boucle \(\text{for}\) ne conviendrait-elle pas ici ?

    Une boucle \(\text{for}\) exige de connaître à l'avance le nombre de tours. Or c'est précisément ce nombre que l'on cherche : la boucle non bornée est la seule adaptée.

Les relevés de température

Une station enregistre les températures d'une semaine dans une liste :

T = [12, 15, 9, 18, 21, 17, 11]
  1. Donner \(T[0]\), \(T[-1]\) et \(\text{len}(T)\).
    $$ T[0] = 12 \qquad T[-1] = 11 \qquad \text{len}(T) = 7 $$
  2. Écrire une fonction qui renvoie la moyenne des relevés.
    def moyenne(L):
        return sum(L) / len(L)

    Ici la moyenne vaut \(\frac{103}{7} \approx 14{,}7 \ °\text{C}\).

  3. Écrire, en compréhension, la liste des jours où la température a dépassé \(15 \ °\text{C}\).
    C = [t for t in T if t > 15]
    $$ C = [18, \ 21, \ 17] $$
  4. Écrire un programme qui compte les jours où la température a augmenté par rapport à la veille.
    c = 0
    for i in range(1, len(T)):
        if T[i] > T[i - 1]:
            c = c + 1
    print(c)

    Le parcours doit se faire par indice , puisqu'on compare chaque élément à son voisin. Le programme affiche \(3\).

Le programme qui se trompe

Un élève veut construire la liste des dix premiers carrés, mais son programme échoue :

L = []
for k in range(10):
    L[k] = k * k
print(L)
  1. Expliquer pourquoi ce programme provoque une erreur.

    La liste \(L\) est vide : l'indice \(0\) n'existe pas encore. On ne peut modifier que des cases déjà créées , et l'écriture \(L[k] = \dots\) suppose qu'elles le soient.

  2. Corriger le programme de deux façons différentes.

    Par ajouts :

    L = []
    for k in range(10):
        L.append(k * k)

    En compréhension :

    L = [k * k for k in range(10)]
  3. Que contient la liste obtenue ? Donner son dernier élément et son indice.
    $$ L = [0, \ 1, \ 4, \ 9, \ 16, \ 25, \ 36, \ 49, \ 64, \ 81] $$

    Le dernier élément vaut \(81\), et son indice est \(9\) - pas \(10\).

  4. Modifier la compréhension pour ne garder que les carrés pairs.
    L = [k * k for k in range(10) if k % 2 == 0]
    $$ L = [0, \ 4, \ 16, \ 36, \ 64] $$