Promedio de calificaciones
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 51 de 56.
Agrega un método que devuelva el promedio de las calificaciones de un estudiante, exactamente el tipo de cálculo de resumen para el que Enumerable fue diseñado.
Ten cuidado con dos casos de borde: el estudiante no existe y el estudiante aún no tiene calificaciones.
Desafío
FácilAgrega un método average_grade(name) que:
- Imprima
Student '<name>' not found.y devuelvanilsi el nombre no existe. - Devuelva
0si el estudiante existe pero no tiene calificaciones. - De lo contrario, devuelva la media aritmética de
:gradescomo un Float.
Reemplaza el bloque de prueba con:
add_student("Alice", 20, ["Math"])
add_student("Bob", 22, ["Biology"])
add_grade("Alice", 90)
add_grade("Alice", 80)
puts average_grade("Alice")
puts average_grade("Bob")
puts average_grade("Charlie").inspectSalida esperada:
Student 'Alice' added.
Student 'Bob' added.
Grade 90 added for 'Alice'.
Grade 80 added for 'Alice'.
85.0
0
Student 'Charlie' not found.
nilHoja de referencia
Maneja casos de borde al calcular promedios de una colección:
def average_grade(name)
student = @students.find { |s| s[:name] == name }
if student.nil?
puts "Student '#{name}' not found."
return nil
end
grades = student[:grades]
return 0 if grades.empty?
grades.sum.to_f / grades.size
end
- Usa
.findpara localizar un registro; devuelvenilsi no se encuentra. - Protégete contra una colección vacía con
.empty?antes de dividir. - Usa
.to_fen la suma (o el tamaño) para asegurar un resultado Float.
Pruébalo tú mismo
$student_records = {}
def add_student(name, age, courses)
if $student_records.key?(name)
puts "Student '#{name}' already exists."
return
end
$student_records[name] = { age: age, grades: [], courses: courses }
puts "Student '#{name}' added."
end
def add_grade(name, grade)
unless $student_records.key?(name)
puts "Student '#{name}' not found."
return
end
$student_records[name][:grades] << grade
puts "Grade #{grade} added for '#{name}'."
end
# TODO: def average_grade(name), maneja estudiante no encontrado, calificaciones vacías, devuelve el promedio como Float
add_student("Alice", 20, ["Math"])
add_student("Bob", 22, ["Biology"])
add_grade("Alice", 90)
add_grade("Alice", 80)
puts average_grade("Alice")
puts average_grade("Bob")
puts average_grade("Charlie").inspect
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline