Ce Travail Pratique mobilise toutes les notions du niveau Basique : variables, types, opérateurs, conditions, boucles, listes, tuples, dictionnaires, ensembles, fonctions natives.
Contexte
Un professeur vous demande de l'aider à analyser les notes de sa classe. Voici les données :
notes = {
"Alice": 14,
"Bob": 12,
"Charlie": 17,
"Diana": 9,
"Eve": 15,
"Frank": 11,
"Grace": 8,
"Hugo": 13,
"Iris": 18,
"Julien": 10,
}Vous allez écrire progressivement un programme qui répond aux demandes ci-dessous. Chaque partie est indépendante — si vous bloquez sur une, passez à la suivante.
TP récapitulatif — Analyse des notes d'une classe
0 / 6 étapes validées
Étape 1
Partie 1 — Statistiques générales
Questions
- Calculer dans
moyennela note moyenne de la classe, et l'afficher arrondie à 2 décimales. - Ranger la note la plus haute dans
note_maxet la note la plus basse dansnote_min, et les afficher. - Ranger dans
meilleurle prénom de l'élève ayant obtenu la meilleure note, et dansmoins_boncelui de l'élève ayant la plus basse, et les afficher. Les notes de la classe sont toutes différentes : il n'y a pas d'ex æquo. - Calculer dans
ecartl'écart entre la meilleure et la moins bonne note, et l'afficher.
Étape 2
Partie 2 — Analyse par mentions
On définit les mentions suivantes :
| Note | Mention |
|---|---|
| < 10 | Insuffisant |
| 10 ≤ note < 12 | Passable |
| 12 ≤ note < 14 | Assez bien |
| 14 ≤ note < 16 | Bien |
| ≥ 16 | Très bien |
Questions
- Parcourir le dictionnaire et afficher pour chaque élève une ligne de la forme :
Alice a obtenu 14 (Bien). - Compter dans le dictionnaire
compteurcombien d'élèves ont chaque mention. Ses cinq clés sont les cinq mentions, déjà présentes à 0 dans le code de départ. - Ranger dans
admisle nombre d'élèves ayant la moyenne (note ≥ 10), et danstaux_reussitele pourcentage de réussite (admisrapporté au nombre d'élèves, multiplié par 100, sans l'arrondir :80.0pour 8 admis sur 10). Afficher ces deux résultats.
Étape 3
Partie 3 — Doublons et ensembles
Questions
- Construire l'ensemble (
set)notes_distinctesdes notes obtenues, sans doublons, et ranger dansnb_distinctesle nombre de notes distinctes. - Construire l'ensemble
uniquesdes notes qui n'ont été obtenues qu'une seule fois.
Sur les données de la classe, toutes les notes sont différentes : les deux ensembles sont égaux. La correction rejoue votre programme sur des classes où certaines notes se répètent.
Étape 4
Partie 4 — Tirage aléatoire (bonus)
Question
- Utiliser le module
randompour tirer au hasard le prénom d'un élève qui passera au tableau, rangé dansprenom_au_hasard. Afficher son prénom et sa note, sous la formeIris (18)— éventuellement précédée d'un libellé :Au tableau : Iris (18).
Indice : random.choice(sequence) renvoie un élément pris au hasard dans une séquence, par exemple random.choice(["pile", "face"]). Un dictionnaire n'en est pas une : list(notes) donne la liste de ses clés.
Étape 5
Partie 5 — Interaction utilisateur
Questions
- Demander un prénom à l'utilisateur et afficher sa note et sa mention (barème de la partie 2), sous la forme
Charlie a obtenu 17 (Très bien). Si le prénom n'existe pas, afficherPrénom 'Zoe' non trouvé dans la classe., puis passer à la question 2 sans redemander de prénom. - Demander ensuite une note seuil (entier) et afficher les élèves ayant une note ≥ au seuil, un par ligne et dans l'ordre du dictionnaire, sous la forme
- Iris (18).
En dehors des invites de saisie, dont le texte est libre, le programme n'affiche rien d'autre que ces lignes. Avec les saisies Bob puis 16, par exemple :
Bob a obtenu 12 (Assez bien)
- Charlie (17)
- Iris (18)Étape 6
Partie 6 — Classement et présentation
Questions
-
Ranger dans
classementla liste de tuples(prénom, note), du meilleur au moins bon, puis afficher le classement complet de la classe (du meilleur au moins bon) avecenumeratepour numéroter :1. Iris : 18 2. Charlie : 17 3. Eve : 15 ...Indice : trier les items du dictionnaire par note décroissante avec :
sorted(notes.items(), key=lambda t: t[1], reverse=True)(Vous avez rencontré cette forme
key=lambda …avec les fonctions natives ; leslambdaont leur propre chapitre en Partie 3.) -
Construire dans
chaine_nomsla chaîne"Iris, Charlie, Eve, ..."(prénoms du classement séparés par une virgule et une espace). Indice : utilisez.join(). -
Pour chaque élève, dans l'ordre du dictionnaire
notes, construire dans la listebadgesun « badge » au format[ALICE-14]en mettant le prénom en majuscules (utilisez.upper()). Afficher tous les badges sur une seule ligne.
🏆 Bonus — Pour aller plus loin
Une fois les 6 parties maîtrisées, trois défis supplémentaires. Ils sont facultatifs : ils ne comptent pas dans votre progression.
Histogramme. Affichez un diagramme en barres des notes : une ligne par élève, dans l'ordre du dictionnaire notes. Chaque ligne contient, dans cet ordre :
- le prénom, complété par des espaces jusqu'à la longueur du plus long prénom ;
|(une barre verticale entre deux espaces) ;- une étoile
*par point de note ; - un espace, puis la note entre parenthèses.
Les trois premières lignes donnent :
Alice | ************** (14)
Bob | ************ (12)
Charlie | ***************** (17)La longueur du plus long prénom se calcule : la vérification rejoue votre programme avec d'autres élèves.
Ex æquo. Construisez le dictionnaire ex_aequo : pour chaque note obtenue par au moins deux élèves, la liste de leurs prénoms, dans l'ordre du dictionnaire notes. Une note obtenue par un seul élève n'y figure pas. Affichez-le.
Avec la classe de l'énoncé, toutes les notes sont distinctes : ex_aequo est vide. Créez un doublon pour tester — la vérification rejoue votre programme avec d'autres classes.
Note la plus fréquente. Quelle note revient le plus souvent dans la classe ? Rangez :
- dans
frequence, le nombre de fois où elle apparaît ; - dans
plus_frequentes, la liste des notes qui apparaissent ce nombre de fois — il peut y en avoir plusieurs —, triée par ordre croissant.
Affichez-les. Avec la classe de l'énoncé, toutes les notes sont distinctes : chacune apparaît une fois. La vérification rejoue votre programme avec d'autres classes.