Bonjour, jai besoin d'aide rapidement pour mon DM de nsi, exo pratique type bac

Résolu/Fermé
Leziry00 - Modifié le 7 mars 2021 à 18:20
 Leziry00 - 8 mars 2021 à 22:18
Bonjour à tous, je suis en terminale et j'ai besoin d'aide pour mon DM de NSI qui est à rendre avant Lundi (je sais je m'y prend très tard). Le DM contient 2 exercice qui sont les suivants:Exercice1:Soit le couple (note,coefficient):
note est un nombre de type flottant (float) compris entre 0 et 20 ;
coefficient est un nombre entier positif
Les résultats aux évaluations d'un élève sont regroupés dans une liste composée de couples (note,coefficient).
Écrire une fonction moyenne qui renvoie la moyenne pondérée de cette liste donnée en paramètre. Par exemple, l’expression moyenne([(15,2),(9,1),(12,3)]) devra renvoyer le résultat du calcul suivant : (2×15+1×9+3×12)/(2+1+3) = 11,83

Exercice2:On cherche à déterminer les valeurs du triangle de Pascal. Dans ce tableau de forme triangulaire, chaque ligne commence et se termine par le nombre 1. Par ailleurs, la valeur qui occupe une case située à l’intérieur du tableau s’obtient en ajoutant les valeurs des deux cases situées juste au-dessus.Créer une fonction pascal. Elle doit renvoyer une liste correspondant au triangle de Pascal de la ligne 1 à la ligne n où n est un nombre entier supérieur ou égal à 2 (le tableau sera contenu dans la variable C). La variable Ck doit, quant à elle, contenir, à l’étape numéro k, la k-ième ligne du tableau. Voici ce que l’on devra obtenir :
>>> pascal(4)
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
>>> pascal(5)
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1]]
J'ai fait des recherches sur le net et c'est un des sujets pratiques que j'aurais pû avoir en mars. Voici ce que j'ai fait:
def moyenne(notes):
"""
Fonction qui calcule la moyenne pondérée
:param notes: (float) compris entre 0 et 20
:param coeff: (int)
:exemple:
>>> print(moyenne)
moyenne([(15,2),(9,1),(12,3)])
"""
notes = [(15,2),(9,1),(12,3)]
s=0
scoeff=0
for elt in notes():
note = (15,9,12)
coeff = (2,1,3)
note = notes[0,0]
print(note)

for i in range(0,3):
s=s+coeff[i]*note[i]
scoeff=sc+sum(coeff)
print(s/scoeff)

def pascal(n):
"""

Fonction qui renvoie une liste correspondant au triangle de Pascal de la ligne 1 à la ligne n où n est un nombre entier supérieur ou égal à 2
:n:(int)
:exemple:
>>> pascal(4)
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
"""
C= [[1]]
for k in range(1,n):
Ck = [1]
for i in range(1,k):
Ck.append(C[1][i-1]+C[k-1][1])
Ck.append(1)
C.append(Ck)
return C

La fonction de l'exo 1 ne fonctionne pas quand je fait print(moyenne(notes) et l'exo 2 crash avec un nombre supérieur à 4. Merci d'avance pour votre aide

7 réponses

Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 7 mars 2021 à 16:23
Bonjour,

L'indentation étant importante en Python, merci de copier/coller ici ton code complet avec les balises de code
mode d'emploi:
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Visuellement, ça doit ressembler à ceci (avec la coloration syntaxique) :

def test():
    print('test')

test()


De plus si on fait
print(moyenne(notes))

ca veut dire que la fonction moyenne est censée retourner une valeur ...
et tu passes notes en argument à la fonction , alors que notes est définie à l'intérieur
1
Donc j'écrit ça:
def moyenne():
0
def moyenne():
    """
    Fonction qui calcule la moyenne pondérée
    :param notes: (float) compris entre 0 et 20
    :param coeff: (int)
    :exemple:
    >>> print(moyenne)
    moyenne([(15,2),(9,1),(12,3)])
    """
    notes = [(15,2),(9,1),(12,3)]
    s=0
    scoeff=0
    for elt in notes():
        note = (15,9,12)
        coeff = (2,1,3)
        note = notes[0,0]
    print(note)

    for i in range(0,3):
        s=s+coeff[i]*note[i]
        scoeff=sc+sum(coeff)
    print(s/scoeff)

def pascal(n):
    """
    Fonction qui renvoie une liste correspondant au triangle de Pascal de la ligne 1 à la ligne
    n où n est un nombre entier supérieur ou égal à 2       
    :n:(int)
    :exemple:
    >>> pascal(4)
    [[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
    """
    C= [[1]]
    for k in range(1,n):
        Ck = [1]
        for i in range(1,k):
            Ck.append(C[1][i-1]+C[k-1][1])
        Ck.append(1)
        C.append(Ck)
    return C  
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Leziry00
7 mars 2021 à 17:11
maintenant peux-tu nous montrer comment tu appelles tes fonctions, et le résultat que tu obtiens?
0
Leziry00 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
7 mars 2021 à 17:22
Pour l'exercice 1, j'entre ceci dans le shell:
print(moyenne(notes))

et j'obtient : Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
NameError: name 'notes' is not defined

Et pour l'exerice 2, je tape ça:
pascal(4)

et j'obtient:
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1]]
alors que je devrais avoir ça:
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]

Et quand je tape un nombre supérieur à 4 :
pascal(5)
, j'obtient ça:
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
File "C:\Lycée\nsi\Terminale\DM\DM NSI 3.py", line 36, in pascal
Ck.append(C[1][i-1]+C[k-1][1])
IndexError: list index out of range
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Leziry00
7 mars 2021 à 17:36
as-tu compris le message d'erreur en ligne 36?
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 7 mars 2021 à 17:33
Bien sur, c'est ce que je te disais dans mon message précédent:

print(moyenne(notes))
et j'obtient : Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
NameError: name 'notes' is not defined

le nom notes n'est pas défini au moment où tu appelle moyenne(notes)
il est défini à l'intérieur de la fonction, donc trop tard

Et je te répète, pour faire print(moyenne(notes)) , il faut un return(s/scoeff) en fin de fonction
1
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 7 mars 2021 à 18:07
Comment ça "Et comment je définis ?"

tu l'as déjà fait dans ta fonction:
notes = [(15,2),(9,1),(12,3)]

sauf qu'il faut déplacer ça avant la définition de fonction, donc avant le def ...
1
C'est fait. Maintenat quand je fais
print(moyenne(notes))
ça donne:
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
File "C:\Lycée\nsi\Terminale\DM\DM NSI 3.py", line 13, in moyenne
for elt in notes():
TypeError: 'list' object is not callable

Je dois enlever le "notes" du
for elt in notes():
?
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
7 mars 2021 à 18:33
Non, c'est qu'on ne peut pas parcourir une liste de tuples comme tu le fais
notes est une liste de 3 tuples ...

il faut faire une boucle avec range comme tu le fais plus bas:
for k in range(len(notes)):


C'est élémentaire, tout ça, il faudrait vraiment que tu apprennes les bases ...
1
Oui je sais que j'ai beaucoup à apprendre. Voici le code maintenant:
notes = [(15,2),(9,1),(12,3)]
def moyenne(notes):
    """
    Fonction qui calcule la moyenne pondérée
    :param notes: (float) compris entre 0 et 20
    :param coeff: (int)
    :exemple:
    >>> print(moyenne)
    moyenne([(15,2),(9,1),(12,3)])
    """
    s=0
    scoeff=0
    note = (15,9,12)
    coeff = (2,1,3)
    for i in range(len(notes)):
        s=s+coeff[i]*note[i]
        scoeff=scoeff+coeff[i]
    return(s/scoeff)


Quand je fais
print(moyenne(notes))
ça donne
12,5
alors que je devrais obtenir 11,83
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Leziry00
7 mars 2021 à 19:29
détaille ton calcul, explique pourquoi tu devrais obtenir 11.83.
a+-tu compris l'énoncé, ou est-ce ton ami qui l'a compris?
0
Leziry00 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
7 mars 2021 à 19:41
L'exercice 1 j'ai compris l'énoncé, la fonction doit faire note*coeff+note*coeff+note*coeff diviser par la somme des coeff . C'est la formule qui calcul la moyenne pondérée non ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 7 mars 2021 à 19:32
?

(15x2)+(9x1)+(12x3)=75
2+1+3=6
75/6 = 12.5
1
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
7 mars 2021 à 19:32
je pense que le programme
moyenne
est correct. peut-être parce qu'il a été écrit par quelqu'un d'autre, qui a compris l'énoncé.
0
Mon professeur a écrit ça dans l'énoncé :
Écrire une fonction moyenne qui renvoie la moyenne pondérée de cette liste donnée en paramètre. Par exemple, l’expression moyenne([(15,2),(9,1),(12,3)]) devra renvoyer le résultat du calcul suivant : (2×15+1×9+3×12)/(2+1+3) = 11,83
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Leziry00
7 mars 2021 à 19:55
as-tu vérifié le calcul du professeur?
0
Leziry00 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
7 mars 2021 à 20:49
Oui, ça fait 12,5. Merci beaucoup à vous 2 pour votre aide. Il me reste que le 2.
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
8 mars 2021 à 08:45
Bonjour,

Par contre, tu n'utilises pas la variable notes pour la découper en ses différents éléments

tu as codé "en dur" les variables note et coeff pour faire le découpage

et donc ton programme ne fonctionne que pour ces valeurs là ...
1
Bonjour Phil,

D'accord mais comment je fais pour découper ?
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178 > Leziry00
8 mars 2021 à 13:06
avec ta boucle:

for i in range(len(notes)): 
    print(notes[k])


notes[k] te donne chaque tuple contenu dans la liste
ensuite tu re découpe chaque tuple (par exemple (15,2) ) pour extraire les 2 chiffres 15 et 2, etc...
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024
8 mars 2021 à 13:31
s=s+notes[i][1]*notes[i][0]
scoeff=scoeff+notes[i][1]
0
Leziry00 > Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024
8 mars 2021 à 21:35
Bonsoir, désolé de répondre si tard. Encore merci à vous deux, maintenant mon code fonctionne avec n'importe quelle note et coefficient.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Leziry00
8 mars 2021 à 21:42
peux-tu alors marquer la discussion comme résolue?
0
Donc je définis avant le for elt in notes ? Et comment je définis ?
0