Exercice 1 : Le parcours séquentiel : quatre schémas, un seul motif
Un serveur enregistre, heure par heure, le nombre de connexions reçues. Le relevé tient dans un tableau de huit cases.
Parcourir ce tableau, c'est toujours le même geste : on part d'une valeur de départ, on la met à jour case après case, et l'on rend le résultat À LA SORTIE de la boucle. Ce qui change d'un schéma à l'autre, c'est la valeur de départ et la mise à jour, jamais le motif.
Les trois fonctions ci-dessous suivent ce motif. La troisième le suit mal.
t = [12, 7, 25, 7, 19, 3, 25, 14]
def total(t):
s = 0
for v in t:
s = s + v
return s
def combien_au_dessus(t, seuil):
c = 0
for v in t:
if v > seuil:
c = c + 1
return c
def present(t, x):
for v in t:
if v == x:
return True
else:
return False- a) Donnez la valeur de , puis le nombre moyen de connexions par heure.
- b) Donnez la valeur de .
- c) renvoie , alors que figure deux fois dans . Expliquez précisément pourquoi, dites pour quelles valeurs de la fonction répond juste, puis corrigez-la en déplaçant une seule ligne.
- d) Écrivez , qui renvoie l'indice de la PREMIÈRE case contenant , et si est absent. Donnez , et .
Voir la correction
Réponses
- a) , soit connexions par heure en moyenne
- b)
- c) La fonction ne regarde que : elle est juste pour et pour toute valeur absente, fausse pour les cinq autres valeurs présentes
- d) , et
a) La somme vaut , et le tableau compte cases, donc la moyenne vaut connexions par heure. Le schéma est celui de l'ACCUMULATEUR : une variable initialisée à la valeur neutre de l'opération, ici pour une addition, mise à jour à chaque case. Vérification rapide : la plus petite valeur vaut et la plus grande , donc la moyenne doit tomber entre les deux, ce qui est le cas. Une moyenne hors des bornes signale toujours une erreur de somme ou un mauvais diviseur.
b) Les valeurs strictement supérieures à sont , , et , donc la fonction renvoie . C'est le schéma du COMPTEUR, un accumulateur dont la mise à jour est conditionnelle : on part de et on ajoute quand le test réussit. Le piège habituel est d'écrire à l'initialisation, ce qui compte une case qui n'existe pas, ou d'écrire au lieu de , ce qui répond à une autre question. La valeur compte, car le test est strict dans le sens attendu ; si l'énoncé avait dit « au moins », il aurait fallu .
c) Le est DANS la boucle. Au tout premier tour, vaut ; le test échoue, on passe au , et le termine la fonction avant même d'avoir regardé la deuxième case. La fonction ne décide donc jamais que sur . Elle répond juste par accident dans deux cas : quand vaut , où elle renvoie à raison, et quand est absent du tableau, où est la bonne réponse. Elle se trompe sur les cinq autres valeurs présentes, , , , et . La correction tient en un décalage : le doit sortir de la boucle et se placer APRÈS elle, sans . C'est la règle du schéma d'EXISTENCE : on ne peut conclure « non » qu'une fois toutes les cases vues, alors qu'on peut conclure « oui » dès la première qui convient. Une réponse trop tôt vaut zéro à la question, car la fonction rend un résultat faux sans lever la moindre erreur.
d) On parcourt les INDICES et non les valeurs, puisque c'est un indice qu'on doit rendre : , et si alors . Après la boucle, et seulement après, . La valeur apparaît aux indices et ; le premier rencontré est celui de l'indice , donc la fonction renvoie . La valeur apparaît aux indices et , donc elle renvoie . La valeur est absente, donc . Le choix de comme code d'absence tient à ce qu'aucun indice valide n'est négatif : rendre serait ambigu, puisque est un indice parfaitement légitime.