0
votes

Comment puis-je modifier ma sortie pour que les notes soient derrière les noms?

Tout d'abord, je suis un noob de programmation complet mais j'ai dû faire ce petit devoir pour que l'école réussisse donc ça m'aiderait vraiment si quelqu'un pouvait me donner la dernière réponse à ma question. (BTW J'UTILISE LE DERNIER PYTHON)

Je vais donc résumer le devoir: j'ai reçu un fichier .txt avec une liste de 10 étudiants, après chaque nom d'élève, il y a 3 notes (la note la plus basse peut être 1 et la note la plus élevée a 10).

Petit exemple de l'apparence de la liste:

Tom Bombadil __________ 6,5 5,5 4,5

Dain IJzervoet ________ 6,7 7,2 7,7

Thorin Eikenschild____6 .8 7.8 7.3

Maintenant, je dois taper un code qui donnera exactement cette sortie lorsque je lance le programme:

Report for group 2b
5.5
Tom Bombadil has an average grade of  None
7.2
Dain IJzervoet has an average grade of  None
7.3
Thorin Eikenschild has an average grade of  None
4.6
Meriadoc Brandebok has an average grade of  None
4.5
Sam Gewissies has an average grade of  None
1.8
Gollem has an average grade of  None
6.8
Frodo Ballings has an average grade of  None
9.5
Gandalf de Grijze has an average grade of  None
6.2
Peregrijn Toek has an average grade of  None
8.8
Radagast de Bruine has an average grade of  None
End of report

Process finished with exit code 0

Ceci est mon code maintenant :

NUMBER_OF_GRADES = 3

def print_geo_grades(input_grades):
    all_grades = list(map(float, input_grades.split(" ")))

    first_grade = all_grades[0]
    second_grade = all_grades[1]
    third_grade = all_grades[2]

    average_grade = (first_grade + second_grade + third_grade) / NUMBER_OF_GRADES

    print("%.1f" % average_grade)

def print_student(all_students):
    student_details = all_students.split("_")

    full_name_student = student_details[0]
    all_grades = student_details[-1]

    print("%s has an average grade of " % full_name_student, print_geo_grades(all_grades))

'''Start Program'''
print("Report for group 2b")
students = open('geo_grades1.in.txt').readlines()

for each_student in students:
    print_student(each_student)

print("End of report")

Et voici le résultat qu'il me donne maintenant:

Report for group 2b

Tom Bombadil has an average grade of 5.5

Dain IJzervoet has an average grade of 7.2

Thorin Eikenschild has an average grade of 7.3

Meriadoc Brandebok has an average grade of 4.6

Sam Gewissies has an average grade of 4.5

Gollem has an average grade of 1.8

Frodo Ballings has an average grade of 6.8

Gandalf de Grijze has an average grade of 9.5

Peregrijn Toek has an average grade of 6.2

Radagast de Bruine has an average grade of 8.8

End of report

Comme vous pouvez le voir, les notes moyennes en devant les noms et où les moyennes devraient être, il est dit «Aucun». S'il vous plaît, les gars, j'y suis presque et je dois terminer ça avant vendredi 23h59. VEUILLEZ AIDER UN FRÈRE!


0 commentaires

4 Réponses :


1
votes

Vous devez renvoyer la note à partir de la fonction print_geo_grades au lieu de l'imprimer. Ajoutez simplement le retour et supprimez l'impression de la fonction et cela devrait fonctionner:

def print_geo_grades(input_grades):
    all_grades = list(map(float, input_grades.split(" ")))

    first_grade = all_grades[0]
    second_grade = all_grades[1]
    third_grade = all_grades[2]

    average_grade = (first_grade + second_grade + third_grade) / NUMBER_OF_GRADES

    return round(average_grade,1)


6 commentaires

David, cela a fonctionné, mais le seul problème maintenant est que la note moyenne n'est pas arrondie à une décimale. Puis-je remettre le% .1f derrière cette ligne? (Btw merci beaucoup pour la réponse, je luttais vraiment.


@Atmtje Vous voulez simplement spécifier à nouveau % .1f : print ("% s a une note moyenne de% .1f"% (full_name_student, print_geo_grades (all_grades))) .


@Atmtje C'est au même endroit qu'avant.


@Guimoute, je vais probablement être ennuyeux, mais pouvez-vous s'il vous plaît me montrer quelle partie en copiant et en la collant ici parce que j'ai essayé partout mais cela ne fonctionne pas pour moi:


Je vous en prie! Vous pouvez faire comme @Guimoute suggéré ou également utiliser la fonction python round (voir la réponse mise à jour).


@Atmtje le code suggéré par Guimoute entre dans la fonction print_student , il suffit de remplacer la dernière ligne (l'impression) de cette fonction par le code du commentaire de Guimoute.



0
votes

Vous avez oublié de renvoyer votre average_grade , ajoutez simplement une instruction

return average_grade à votre fonction, telle que

def print_geo_grades(input_grades):
    all_grades = list(map(float, input_grades.split(" ")))

    first_grade = all_grades[0]
    second_grade = all_grades[1]
    third_grade = all_grades[2]

    average_grade = (first_grade + second_grade + third_grade) / NUMBER_OF_GRADES

    return average_grade


1 commentaires

Merci beaucoup mon frère pour l'aide, c'est vraiment apprécié!



0
votes

La fonction que vous appelez ne renvoie aucune valeur. vous pouvez résoudre ce problème de deux manières

  1. au lieu d'imprimer simplement renvoie average_grade

  2. appeler print_geo_grades () en dehors de l'instruction d'impression

    utilisez n'importe lequel.

Le formatage de chaîne que vous utilisez dans l'instruction print est vraiment démodé, reportez-vous plutôt au code ci-dessous

    NUMBER_OF_GRADES = 3

def print_geo_grades(input_grades):
    all_grades = list(map(float, input_grades.split(" ")))

    first_grade = all_grades[0]
    second_grade = all_grades[1]
    third_grade = all_grades[2]

    average_grade = (first_grade + second_grade + third_grade) / NUMBER_OF_GRADES
#just return python will not consider the zeroes after decimal
    return average_grade                                                                                        

def print_student(all_students):
    student_details = all_students.split("_")

    full_name_student = student_details[0]
    all_grades = student_details[-1]
 #new way of writing
    print("{} has an average grade of {}".format(full_name_student, print_geo_grades(all_grades)))             

'''Start Program'''
print("Report for group 2b")
students = open('geo_grades1.in.txt').readlines()
for each_student in students:
    print_student(each_student)

print("End of report")



>Report for group 2b
>Tom Bombadil has an average grade of 5.5
>Dain IJzervoet has an average grade of 7.2
>Thorin Eikenschild has an average grade of 7.3
>End of report


7 commentaires

Je trouve que le formatage des chaînes à l'ancienne et les chaînes f sont tous deux supérieurs à "{}". Format (...) qui a l'air gonflé.


Oui, le retour a effectivement aidé, mais il n'arrondit pas les notes maintenant à une décimale. Quoi qu'il en soit, je pourrais réparer ça?


Python effectue l'arrondi automatiquement.


l'utilisation réelle des chaînes f sera bientôt obsolète. lorsque vous utiliserez le python dans la pratique réelle, vous devrez utiliser le format et comprendrez également ce que .format a à offrir


Très bien frère, merci beaucoup pour votre aide. La seule chose est que cela n'a pas arrondi les notes pour moi dans la sortie très étrange. En fait, j'ai repris votre code et l'ai remplacé par ma pièce, mais il n'a toujours pas arrondi les notes.


@NikhilGhule Allez, les f-strings s'améliorent encore en 3.8 et Python n'arrondit pas automatiquement les nombres ...


Lorsque j'utilise python depuis 2 ans maintenant, je ne sais pas quelle version utilisez-vous, mais je suis sur 3.8.0 et je viens de modifier ma réponse et d'ajouter la sortie que j'ai obtenue



0
votes

En gros, la solution la plus simple est:

import re
from statistics import mean


with open("marks.txt") as fd:
    for line in fd:
        name, raw_marks = re.split(r"_+", line)
        marks = map(float, raw_marks.split())
        print(f"{name} has average grade {mean(marks)}")


1 commentaires

Ne lançons pas deux modules à quelqu'un qui apprend encore les imprimés. split ("") et split ("_") sont très bien ici.