Corrigé - Atelier 9 - Débogueur
Essayez de faire l'atelier avant de consulter ce corrigé.
Numéro 1
Le bug est à la ligne compteurImpairs = compteurPairs + 1: c'est un nom de variable différent de compteurPairs, donc une toute nouvelle variable est créée à chaque itération au lieu de mettre à jour compteurPairs. En avançant avec Step Over tout en surveillant compteurPairs dans le Watch, on voit qu'elle reste à 0 peu importe le nombre d'itérations.
compteurPairs: int = 0
for nombre in range(1, 11):
if nombre % 2 == 0:
compteurPairs += 1
print("Nombres pairs trouvés:", compteurPairs)
Numéro 2
Le bug est à la ligne match note / 10:. Le / fait une division réelle (float), donc note / 10 donne par exemple 7.8 pour une note de 78. Cette valeur n'égale jamais un entier comme 7 (sauf si la note est un multiple exact de 10), donc le match tombe presque toujours dans le case _. En surveillant note / 10 dans le Watch, on voit que la valeur comparée n'est pas ce qui était attendu. Il faut une division entière avec //.
note: int = 78
lettre: str
match note // 10:
case 10 | 9:
lettre = "A"
case 8:
lettre = "B"
case 7:
lettre = "C"
case 6:
lettre = "D"
case _:
lettre = "E"
print("La lettre est", lettre)
Numéro 3
Le bug est à la ligne compteMultiples = 0, à l'intérieur de la boucle for i. Cette ligne remet le compteur à 0 à chaque nouvelle valeur de i, donc seul le décompte de la dernière rangée (i = 5) survit jusqu'au print. En surveillant compteMultiples dans le Watch, on voit sa valeur retomber à 0 chaque fois que i change. Il faut initialiser compteMultiples une seule fois, avant la boucle for i.
TAILLE: int = 5
diviseur: int = 3
compteMultiples: int = 0
for i in range(1, TAILLE + 1):
for j in range(1, TAILLE + 1):
if (i * j) % diviseur == 0:
compteMultiples += 1
print("Nombre de produits multiples de", diviseur, ":", compteMultiples)
Numéro 4
Le bug est à la ligne total += nbTours. Le but est de compter le nombre de tours pairs (donc ajouter 1 à chaque fois), mais le code ajoute nbTours (6) à la place. Le point d'arrêt conditionnel sur resultat % 2 == 0 permet de s'arrêter seulement aux tours pertinents, et on y voit total augmenter de 6 à chaque fois plutôt que de 1.
nbTours: int = 6
total: int = 0
resultat: int
for tour in range(1, nbTours + 1):
resultat = (tour * 7) % 10
if resultat % 2 == 0:
total += 1
print("Nombre de tours pairs:", total)
Numéro 5
Le bug est à la ligne if note > 60:. Le but est de compter les échecs, donc les notes sous 60, mais la condition vérifie l'inverse (> au lieu de <). En surveillant note et nbEchecs dans le Watch à travers les itérations, on voit nbEchecs s'incrémenter pour des notes de réussite (au-dessus de 60) plutôt que pour des échecs.
nbEleves: int = -1
somme: int = 0
sommeCarres: int = 0
notePlusHaute: int = 0
notePlusBasse: int = 100
nbEchecs: int = 0
note: int
moyenne: int
moyenneExacte: float
variance: float
ecartType: float
classement: str
while nbEleves <= 0:
nbEleves = int(input("Combien d'élèves? "))
for i in range(1, nbEleves + 1):
note = int(input(f"Note de l'élève {i}: "))
somme += note
sommeCarres += note * note
if note > notePlusHaute:
notePlusHaute = note
if note < notePlusBasse:
notePlusBasse = note
if note < 60:
nbEchecs += 1
moyenne = somme // nbEleves
moyenneExacte = somme / nbEleves
variance = sommeCarres / nbEleves - moyenneExacte ** 2
ecartType = 0.0
while ecartType * ecartType < variance:
ecartType += 0.01
match moyenne // 10:
case 10 | 9:
classement = "Excellent"
case 8 | 7:
classement = "Bon"
case 6:
classement = "Passable"
case _:
classement = "Faible"
print("Moyenne:", moyenne)
print("Note la plus haute:", notePlusHaute)
print("Note la plus basse:", notePlusBasse)
print("Nombre d'échecs:", nbEchecs)
print("Écart-type:", ecartType)
print("Classement du groupe:", classement)