Une classe est un tableau de p-uplets nommés Eleve
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 4 — Les types construits · Enregistrements et p-uplets nommés
Énoncé
Une classe est un tableau de p-uplets nommés Eleve. Écrire meilleure_moyenne(eleves), puis obtenir par compréhension les noms des élèves ayant au moins , et la moyenne de la classe. Que renvoie la fonction en cas d'ex æquo, et comment le dire honnêtement ?
Corrigé
classe = [Eleve("Nour", 17, 15.5), Eleve("Camille", 16, 12.0),
Eleve("Yanis", 17, 15.5), Eleve("Lou", 16, 9.5)]
def meilleure_moyenne(eleves):
"""UN eleve de moyenne maximale.
Precondition : eleves est un tableau non vide de p-uplets Eleve.
En cas d'ex aequo, le PREMIER rencontre dans le tableau.
"""
assert len(eleves) > 0
meilleur = eleves[0]
for e in eleves:
if e.moyenne > meilleur.moyenne:
meilleur = e
return meilleur
Les deux compréhensions.
[e.nom for e in classe if e.moyenne >= 12]
# ['Nour', 'Camille', 'Yanis']
sum(e.moyenne for e in classe) / len(classe)
# 13.125
Le filtre porte sur un champ du p-uplet et l'expression sur un autre : c'est exactement le schéma « source, filtre, expression » de la figure du cours, appliqué à des enregistrements.
L'ex æquo, et l'honnêteté. Nour et Yanis ont tous deux . meilleure_moyenne renvoie Nour, parce que la comparaison est > strict : le premier rencontré garde sa place. La docstring doit le dire — « un élève de moyenne maximale », et non « l'élève de meilleure moyenne ». Si l'on avait écrit >=, ce serait Yanis, et la fonction serait tout aussi correcte : c'est bien la preuve qu'il n'y a pas de réponse unique, et donc rien à promettre.
La solution qui supprime la question, comme pour indices_des : renvoyer tous les ex æquo.
maxi = meilleure_moyenne(classe).moyenne
[e.nom for e in classe if e.moyenne == maxi] # ['Nour', 'Yanis']
Deux parcours au lieu d'un, mais une spécification sans ambiguïté. Quand une postcondition devient embarrassée, c'est souvent le résultat qu'il faut changer.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.