Application du système de notation à un ensemble de données réel
Appliquons maintenant notre système de notation à un scénario plus réaliste. Nous allons créer un programme qui lit les données des étudiants à partir d'un fichier, calcule les notes et écrit un rapport complet.
Création d'un exemple d'ensemble de données
Tout d'abord, créons un fichier avec des exemples de données d'étudiants. Créez un nouveau fichier appelé student_data.csv dans le répertoire /home/labex/project avec le contenu suivant :
name,subject,marks
John,Mathematics,88
Emily,Mathematics,92
Michael,Mathematics,75
Sophia,Mathematics,68
Daniel,Mathematics,42
Olivia,Mathematics,95
William,Mathematics,73
Emma,Mathematics,60
James,Mathematics,79
Ava,Mathematics,85
Création de l'application de notation complète
Maintenant, créez un nouveau fichier appelé grading_application.py dans le répertoire /home/labex/project :
def get_grade_with_feedback(marks):
"""
Convertir les notes numériques en notes littérales avec des commentaires personnalisés.
Retourne un tuple contenant la note et un message de commentaire.
"""
try:
marks = float(marks)
if marks < 0 or marks > 100:
return (None, "Invalid marks: must be between 0 and 100")
elif marks >= 90:
return ('A', "Excellent! Outstanding performance.")
elif marks >= 80:
return ('B', "Very good! Above average performance.")
elif marks >= 70:
return ('C', "Good work! Average performance.")
elif marks >= 60:
return ('D', "Satisfactory. Below average but passing.")
else:
return ('F', "Needs improvement. Please study more.")
except ValueError:
return (None, "Invalid marks: not a number")
def process_student_data(input_filename, output_filename):
"""
Traiter les données des étudiants à partir d'un fichier CSV et générer un rapport.
"""
try:
## Lire le fichier d'entrée
with open(input_filename, 'r') as file:
lines = file.readlines()
## Ignorer la ligne d'en-tête
headers = lines[0].strip().split(',')
data = [line.strip().split(',') for line in lines[1:]]
## Préparer la sortie
output_lines = ["Student Grade Report\n", "=" * 20 + "\n\n"]
## Calculer les statistiques
valid_marks = []
grade_counts = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'F': 0, 'Invalid': 0}
## Traiter chaque étudiant
for student in data:
name, subject, marks = student
grade, feedback = get_grade_with_feedback(marks)
if grade:
valid_marks.append(float(marks))
grade_counts[grade] += 1
output_lines.append(f"Student: {name}\n")
output_lines.append(f"Subject: {subject}\n")
output_lines.append(f"Marks: {marks}\n")
output_lines.append(f"Grade: {grade}\n")
output_lines.append(f"Feedback: {feedback}\n\n")
else:
grade_counts['Invalid'] += 1
output_lines.append(f"Student: {name}\n")
output_lines.append(f"Subject: {subject}\n")
output_lines.append(f"Error: {feedback}\n\n")
## Calculer les statistiques
if valid_marks:
average_mark = sum(valid_marks) / len(valid_marks)
max_mark = max(valid_marks)
min_mark = min(valid_marks)
output_lines.append("Class Statistics\n")
output_lines.append("-" * 15 + "\n")
output_lines.append(f"Average Mark: {average_mark:.2f}\n")
output_lines.append(f"Highest Mark: {max_mark:.1f}\n")
output_lines.append(f"Lowest Mark: {min_mark:.1f}\n\n")
output_lines.append("Grade Distribution\n")
output_lines.append("-" * 17 + "\n")
for grade, count in grade_counts.items():
output_lines.append(f"{grade}: {count}\n")
## Écrire le fichier de sortie
with open(output_filename, 'w') as file:
file.writelines(output_lines)
print(f"Report successfully generated and saved to {output_filename}")
except Exception as e:
print(f"An error occurred: {str(e)}")
## Run the application
input_file = "/home/labex/project/student_data.csv"
output_file = "/home/labex/project/grade_report.txt"
process_student_data(input_file, output_file)
## Display the report in the console as well
print("\nGenerated Report Contents:")
print("--------------------------")
with open(output_file, 'r') as file:
print(file.read())
Exécution de l'application complète
Exécutez l'application :
python3 /home/labex/project/grading_application.py
Le programme lira les données des étudiants, calculera les notes, générera un rapport et l'affichera dans la console. Vous devriez voir une sortie similaire à :
Report successfully generated and saved to /home/labex/project/grade_report.txt
Generated Report Contents:
--------------------------
Student Grade Report
====================
Student: John
Subject: Mathematics
Marks: 88
Grade: B
Feedback: Very good! Above average performance.
Student: Emily
Subject: Mathematics
Marks: 92
Grade: A
Feedback: Excellent! Outstanding performance.
...
Class Statistics
---------------
Average Mark: 75.70
Highest Mark: 95.0
Lowest Mark: 42.0
Grade Distribution
-----------------
A: 2
B: 2
C: 3
D: 1
F: 2
Invalid: 0
Examen du fichier de rapport
Vous pouvez également vérifier le fichier de rapport généré :
cat /home/labex/project/grade_report.txt
Le fichier doit contenir le même contenu que celui affiché dans la console.
Compréhension de l'application complète
L'application de notation complète que nous avons créée démontre plusieurs concepts de programmation importants :
- Entrées/Sorties de fichiers (File I/O) : Lecture et écriture de données dans des fichiers
- Traitement des données (Data Processing) : Conversion et analyse des données brutes
- Calcul des statistiques (Statistics Calculation) : Calcul des moyennes et recherche des valeurs minimales/maximales
- Gestion des erreurs (Error Handling) : Gestion des erreurs potentielles lors des opérations sur les fichiers
- Formatage de la sortie (Formatting Output) : Création d'un rapport bien structuré et lisible
Cette application représente un cas d'utilisation réel de notre système de notation, montrant comment les instructions if-elif-else de Python peuvent être appliquées pour résoudre des problèmes pratiques dans les contextes éducatifs.