Aplicando el Sistema de Calificación a un Conjunto de Datos Real
Ahora, apliquemos nuestro sistema de calificación a un escenario más realista. Crearemos un programa que lee datos de estudiantes de un archivo, calcula las calificaciones y escribe un informe completo.
Creando un Conjunto de Datos de Ejemplo
Primero, creemos un archivo con datos de estudiantes de ejemplo. Crea un nuevo archivo llamado student_data.csv en el directorio /home/labex/project con el siguiente contenido:
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
Creando la Aplicación de Calificación Completa
Ahora, crea un nuevo archivo llamado grading_application.py en el directorio /home/labex/project:
def get_grade_with_feedback(marks):
"""
Convertir notas numéricas a calificaciones con letras con retroalimentación personalizada.
Devuelve una tupla que contiene la calificación y un mensaje de retroalimentación.
"""
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):
"""
Procesar datos de estudiantes desde un archivo CSV y generar un informe.
"""
try:
## Leer el archivo de entrada
with open(input_filename, 'r') as file:
lines = file.readlines()
## Omitir la línea de encabezado
headers = lines[0].strip().split(',')
data = [line.strip().split(',') for line in lines[1:]]
## Preparar la salida
output_lines = ["Student Grade Report\n", "=" * 20 + "\n\n"]
## Calcular estadísticas
valid_marks = []
grade_counts = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'F': 0, 'Invalid': 0}
## Procesar cada estudiante
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")
## Calcular estadísticas
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")
## Escribir el archivo de salida
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())
Ejecutando la Aplicación Completa
Ejecuta la aplicación:
python3 /home/labex/project/grading_application.py
El programa leerá los datos de los estudiantes, calculará las calificaciones, generará un informe y lo mostrará en la consola. Deberías ver una salida similar a:
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
También puedes verificar el archivo de informe generado:
cat /home/labex/project/grade_report.txt
El archivo debería contener el mismo contenido que se mostró en la consola.
Entendiendo la Aplicación Completa
La aplicación de calificación completa que creamos demuestra varios conceptos de programación importantes:
- Entrada/Salida de Archivos (File I/O): Leer datos de y escribir datos en archivos
- Procesamiento de Datos: Convertir y analizar datos sin procesar
- Cálculo de Estadísticas: Calcular promedios y encontrar valores mínimos/máximos
- Manejo de Errores: Gestionar posibles errores durante las operaciones de archivos
- Formateo de la Salida: Crear un informe bien estructurado y legible
Esta aplicación representa un caso de uso del mundo real para nuestro sistema de calificación, mostrando cómo las sentencias if-elif-else de Python se pueden aplicar para resolver problemas prácticos en entornos educativos.