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.
Lire un programme et prévoir son résultat sans l'exécuter.
Générer une liste en extension, par ajouts successifs ou en compréhension.
Choisir entre une boucle bornée et une boucle non bornée.
Découper un traitement en fonctions.
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\).
-
Écrire la relation de récurrence liant \(u_{n+1}\) à \(u_n\).$$ u_{n+1} = 1{,}04 \, u_n \qquad u_0 = 1 \ 200 $$
-
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) -
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} $$
-
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]
-
Donner \(T[0]\), \(T[-1]\) et \(\text{len}(T)\).$$ T[0] = 12 \qquad T[-1] = 11 \qquad \text{len}(T) = 7 $$
-
É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}\).
-
É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] $$ -
É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)
-
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.
-
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)]
-
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\).
-
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] $$