Moyenne pondérée(II)

Un professeur de NSI décide de gérer les résultats de sa classe sous la forme d'un dictionnaire :

  • les clés sont les noms des élèves ;
  • les valeurs sont des dictionnaires dont les clés sont les types d'épreuves et les valeurs sont des listes dont le premier élément est la note obtenue, et le deuxième le coefficient associé.

Avec :

resultats_trimestre = {'Dupont':{'DS1': [15.5, 4],
                                 'DM1': [14.5, 1],
                                 'DS2': [13, 4],
                                 'PROJET1': [16, 3],
                                 'DS3': [14, 4]},
                       'Durand':{'DS1': [6 , 4],
                                 'DM1' : [14.5, 1],
                                 'DS2' : [8, 4],
                                 'PROJET1' : [9, 3],
                                 'IE1' : [7, 2],
                                 'DS3' : [8, 4],
                                 'DS4' :[15, 4]}}

L'élève dont le nom est Durand a ainsi obtenu au DS2 la note de \(8\) avec un coefficient \(4\).

L'élève dont le nom est Dupont était absent à l'épreuve DS4 : l'épreuve n'apparait donc pas dans son relevé de notes.

Le professeur crée une fonction moyenne qui prend en paramètres nom qui est le nom d'un de ces élèves et le dictionnaire resultats qui représente les résultats des ses élèves comme décrit ci-dessus. Cette fonction renvoie la moyenne de l'élève arrondie au dixième. Si le nom de l'élève n'apparait pas dans le dictionnaire des résultats, la fonction renvoie la valeur \(-1\).

Exemples

>>> moyenne('Durand', resultats_trimestre)
9.2
>>> moyenne('Martin', resultats_trimestre)
-1
assert ?

Le mot clé assert est utilisé en Python afin de vérifier que des propositions sont vraies.

Ainsi, l'instruction assert 3 + 5*7 == 38 permet de vérifier que l'expression 3 + 5*7 est bien évaluée à 38.

Si c'est le cas, le programme continue de se dérouler normalement. Dans le cas contraire, le programme est interrompu et une erreur est signalée.

Comparaison de nombres flottants

Lorsqu'on écrit a = x ou x est un nombre réel, la valeur de a enregistrée en machine est une valeur approchée de x (quelques fois la valeur exacte). Cette valeur approchée a la forme d'un nombre flottant (le type float en Python). En conséquence, alors que des calculs et des comparaisons peuvent être effectués de manière exacte sur des réels, ils ne le sont que de manière approchée sur leur représentation en machine. On peut donc obtenir par exemple, avec a = x et b = y, l'expression a == b évaluée à True alors que x et y sont différents.

C'est pourquoi les tests ne vérifient pas l'égalité des résultats et des valeurs attendues mais leur proximité.

Ainsi, on peut vérifier que \(\sqrt{2} \approx 1,414214\) en faisantassert abs(1.414214 - sqrt(2)) < 1e-6. Ce test vérifie que les deux valeurs sont proches à \(10^{-6}\) près.

Compléter le code du professeur ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013,[snacPmy7)f]4_wu29l3 (6ev0-8;*b+okp/ihSg1t:5=.dr050W0z0R0f0M0u0d0w0g0u0f0d0d0U010R0M0K010406050d0r0i0i0f0X0j040O0I0u0r0=0I0e050L0|0~10120`0K041b1i051l0L1l1n1i0`0W0M0A0*0,0.0:0N0M0P0N0u1B0N0R0^050#0G0u0z1w0-0/011A1C1E1C0R1K1M1I0R0G0I0W121J0X1j0R0N0*150d0K0f0e0:0s011O1y010m0%0z0e0f0i0z1I1:1=1`1Q1}1M20220^0a0w0h0X0I0K0I0d0M180e0w0Z1.0X0X0z0g2n1b250e1j0L1,2A0R1*1)1+0W270:1E0e1 2k1I1t1v0+1P2K0M2M0e1$1u1I0K2t1j2y2A2(0{1;2o2S1{2X0X0 0u0^0w0Q2x2,0_2+262.1Q2:2=2@0s2`1=2|2y2J01310f2?040w0v352z0`382 0:3b3d0w0o3h372,393n2@0T3r3j3t3l3a0I2;3c2@0y3y2}2-1x303D323e0k3I3k3L3m3N3F3e0D3R3A3T3C3E3o0t3Z2~3#3v040Q0B3*3K2T3$3O0Q2_1c2{3z3+3?3-0Q343{363}3=2/3V3d0Q3g433i3J3u480^0Q3q4c3s3~473%4h3x4k1k2$1b2Q2D0W2H390g1$231j4v1m4t2*4r4A0Z2%3!3?0J0^0Z0m3r4e3B0q2@4S3S3 0m0^0d190R0p2#0I0g0N0z0d4X4M1{0@040x4:4m300^0f4_461Q4?0b3r0w4T3,0^0G4~394?0l0S3y0w5f544Y1{4O042t0R0r0X1a4k5h4;300G4|0G4/4r5i500^4^5z5t3m4|53553?0I0^0C5I5A5G04585E4`0:5b5O5F015L04020u0R0E5X5U010i4!040B0V0B5=5=3`2(0645395k4Q594U4W5T4 3m5.0i0I0j1 2M5 3#4?5D2*5P3a0^2X0i6b3?515*636h5l4.0r5%0f0R5y6f5Y5b5d4k065g5s5+5k0M4R5r5J2/6i0I6k6K6g0I4V042V6o3u0^2t0|6u6w6l4=0^6B5_6E6E6L4{042X0R4.0p0!0p4A0z0m6J2(6F6p5!0U6W3B0e6Y6s6#6x2{6.5V0^0c6%6/6j7f7c040n5e6,5f7b6q4$0~0z4)0I2V6$6Q5Y71733#0i0M0^3:6C7n7o6g75047r226_0I6{1}0g0M1 7x6~7p7A7y5+7D7F7m7n7p5k0m3D7B3 0^0 0=0z2t7.1{6S0^6V7!6p7L6;6?6^6`6|7i014?6*3|7I6,7p7 0I6=856n7}6X04837S7U0e0R7^1Q7Z7X7K6N6=0d6@4(8l8g7d857L7;7U7@625a0^7l7H8a5g8c4#6O7O2j7w79366 398s2{8X748Q7s7u8U8q0:5!0H8+6q8l0M7T7V855!0F8D8v0z7(8N8P7M8R7t8;8?8o8V2z8#3#8Z8W907N937Q6|8=8n7W8!7Y0^8.8i8$8k9g8m8@8M7)6g5k5m5o5q8t5Y0e5v5l0I0r0e0W8B4@8{918(8T968/5!0L8/7L9e7P7R9i7V974L5+8h9C7#7E3.9L0l8~7*0^0z0(8}8I3B878~6-9x765n5p9S5M857$9-6C1b4J0z2A2#aa4u1u4w2D2F2B1#1%2D0f1Lad0L4v0`aq0!0$0(04.