Imprimer
Catégorie : Programmation Python - STAV
Affichages : 5487

Objectif

Reprendre le script du jeu se trouvant en dessous élaboré par Etaine BRUNET, élève de première STAV en 2021 (accord pour citation de sa part) et le modifier le afin de calculer la fréquence des erreurs faites par le joueur par tables. Pour comprendre l'esprit du script, voir ici.

Imaginons que la valeur aléatoire de a soit 7 et que celle de b soit 5, alors il est demandé au joueur le résultat de 7x5. Supposons que le joueur réponde 34, nous partirons alors du principe que le joueur ne connaît pas la table de 7 NI la table de 5. Ces deux tables seront donc à ajouter dans la liste d'erreurs.

L'objectif sera donc en fin de partie de disposer d'une liste de toutes les erreurs faites par le joueur, par exemple : [7,5,5,3,2,9] (ici le joueur a joué trois fois et c'est trompé à chaque fois) et de calculer les fréquences de ses erreurs par tables de multiplication.

#------------------
# proposition initiale faite par Etaine
#------------------
from random import randint
n=0
max=3
for i in range (max):
    a=randint(1,10)
    b=randint(1,10)
    print(a,"x",b,"=?")
    rep=int(input("Votre réponse=?"))
    if rep==a*b:
       print ("Bravo mon ptit pote, t'as 1 point de plus")
       n=n+1
    else:
        print ("Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY")

print("----------------------------------------------")
print ("Nombre d'essais:",max,"et nombre de bonnes réponses:",n)
print ("Voici ta note sur 20 coco,",n/max*20,"/20")  

Testez ce script et comprenez le...


Etape 1 - Présentation des listes et de la méthode append()

Que l'on soit bien d'accord, pour l'instant mon programme ne conserve rien dans sa mémoire. Pour chaque tour dans la boucle, il calcule a,b, mémorise rep, incrémente n (ou pas) puis les valeurs de ces variables sont écrasées lors de la boucle suivante...

Il est temps de faire appel aux listes et à ces méthodes. Pour la doc voir ici: https://docs.python.org/fr/3/tutorial/datastructures.html

 

Tester le script suivant

Le script

vide=[]
pasvide=[2,"rieffel",2.58]
print(vide)
print(type(vide))
print(pasvide)
print(type(pasvide))
vide.append(12)
vide.append("plus vide")
print("-----")
print(vide)

Le résultat

>>> %Run zzz.py
[]
<class 'list'>
[2, 'rieffel', 2.58]
<class 'list'>
-----
[12, 'plus vide']

Pour comprendre

Pour enfoncer le clou

Je veux créer une liste qui contiendra les 100 premiers entiers au cube. Je me dis qu'une boucle me fera gagner du temps! En partant d'une liste vide, je peux ajouter les cubes via la méthode append().

cube=[]
n=0
for i in range (100):
    n=i*i*i
    cube.append(n)

Etape 2 - Mémorisation des erreurs

Rappel:
Ma mission est le calcul des fréquences des erreurs. 

 

Tester le script suivant

En comprenant l'étape 1, j'ai l'idée de faire ceci:

Le script

#------------------
# proposition initiale faite par Etaine, et amélioration du prof
#------------------
from random import randint
n=0
max=3
erreur=[]
for i in range (max):
    a=randint(1,10)
    b=randint(1,10)
    print(a,"x",b,"=?")
    rep=int(input("Votre réponse=?"))
    if rep==a*b:
       print ("Bravo mon ptit pote, t'as 1 point de plus")
       n=n+1
    else:
        print ("Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY")
        erreur.append(a) #ajoute la valeur de a dans la liste erreur
        erreur.append(b) #fait de meme pour b

print("----------------------------------------------")
print ("Nombre d'essais:",max,"et nombre de bonnes réponses:",n)
print ("Voici ta note sur 20 coco,",n/max*20,"/20")
print ("Et les tables dans lesquelles vous vous trompez sont: ",erreur)

Le résultat

>>> %Run aaa.py
3 x 6 =?
Votre réponse=?18
Bravo mon ptit pote, t'as 1 point de plus
6 x 9 =?
Votre réponse=?1
Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY
10 x 1 =?
Votre réponse=?1
Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY
----------------------------------------------
Nombre d'essais: 3 et nombre de bonnes réponses: 1
Voici ta note sur 20 coco, 6.666666666666666 /20
Et les tables dans lesquelles vous vous trompez sont:  [6, 9, 10, 1]

Pour comprendre

=> Au final, ma liste erreur contient toutes les valeurs de a et b pour lesquelles le joueur c'est trompé dans la partie.

 

Simulation avec 10 tours

Je ne teste ici que des réponses fausses. J'ai bien 0/20 et il est normal de voir une liste erreur contenant:

Nombre d'essais: 10 et nombre de bonnes réponses: 0
Voici ta note sur 20 coco, 0.0 /20
Et les tables dans lesquelles vous vous trompez sont:  [8, 5, 7, 9, 3, 1, 4, 9, 10, 2, 6, 6, 7, 5, 10, 10, 10, 1, 1, 2]

Etape 3 - Liste, méthode et calculs

Rappel:
Ma mission est le calcul des fréquences des erreurs. 

J'y suis presque. Je vous redonne le lien de la doc pour celles et ceux qui veulent creuser plus loin.

 

Tester le script suivant

Le script

meserreurs=[8, 5, 7, 9, 3, 1, 4, 9, 10, 2, 6, 6, 7, 5, 10, 10, 10, 1, 1, 2]

print(meserreurs)
print(len(meserreurs))
print(meserreurs[0],meserreurs[4])
print(meserreurs.count(1),meserreurs.count(3),meserreurs.count(10))

print("------------------------------")

n=len(meserreurs)

for i in range(10):
    print(meserreurs.count(i+1))

Le résultat

>>> %Run ttt.py
[8, 5, 7, 9, 3, 1, 4, 9, 10, 2, 6, 6, 7, 5, 10, 10, 10, 1, 1, 2]
20
8 3
3 1 4
------------------------------
3
2
1
1
2
2
2
1
2
4

Pour comprendre


Etape 4 - Calculs des fréquences des erreurs

Rappel:
Ma mission est le calcul des fréquences des erreurs. 

 

Tester le script suivant

Le script

#------------------
# proposition initiale faite par Etaine, et amélioration du prof
#------------------
from random import randint
n=0
max=2
erreur=[]
for i in range (max):
    a=randint(1,10)
    b=randint(1,10)
    print(a,"x",b,"=?")
    rep=int(input("Votre réponse=?"))
    if rep==a*b:
       print ("Bravo mon ptit pote, t'as 1 point de plus")
       n=n+1
    else:
        print ("Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY")
        erreur.append(a) #ajoute la valeur de a dans la liste erreur
        erreur.append(b) #fait de meme pour b

print("----------------------------------------------")
print ("Nombre d'essais:",max,"et nombre de bonnes réponses:",n)
print ("Voici ta note sur 20 coco,",n/max*20,"/20")
print ("Et les tables dans lesquelles vous vous trompez sont: ",erreur)

# frequence des erreurs
print("----------------------------------------------")
totalerreur=len(erreur)
for i in range(10):
    n=erreur.count(i+1)
    print("Pour la table de ",i+1, "vous avez fait ",n, "erreurs sur un total de ",totalerreur)

Le résultat

>>> %Run aaa.py
6 x 10 =?
Votre réponse=?1
Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY
3 x 10 =?
Votre réponse=?1
Bah alors qu'est-ce que tu nous fais, c'est 0 mon pote, SORRY
----------------------------------------------
Nombre d'essais: 2 et nombre de bonnes réponses: 0
Voici ta note sur 20 coco, 0.0 /20
Et les tables dans lesquelles vous vous trompez sont:  [6, 10, 3, 10]
----------------------------------------------
Pour la table de  1 vous avez fait  0 erreurs sur un total de  4
Pour la table de  2 vous avez fait  0 erreurs sur un total de  4
Pour la table de  3 vous avez fait  1 erreurs sur un total de  4
Pour la table de  4 vous avez fait  0 erreurs sur un total de  4
Pour la table de  5 vous avez fait  0 erreurs sur un total de  4
Pour la table de  6 vous avez fait  1 erreurs sur un total de  4
Pour la table de  7 vous avez fait  0 erreurs sur un total de  4
Pour la table de  8 vous avez fait  0 erreurs sur un total de  4
Pour la table de  9 vous avez fait  0 erreurs sur un total de  4
Pour la table de  10 vous avez fait  2 erreurs sur un total de  4

Les fréquences

Sachant qu'une fréquence en statistique se définit comme le rapport de la taille d'une classe sur une population: voir ici https://fr.wikipedia.org/

Modifiez le script pour obtenir ce genre d'affichage:

(La question peut faire peur, mais ayez confiance en vous, et croyez en moi, la réponse est simple ;)))