Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

Agrega un método average_grade(name) que:

  1. Imprima Student '<name>' not found. y devuelva nil si el nombre no existe.
  2. Devuelva 0 si el estudiante existe pero no tiene calificaciones.
  3. De lo contrario, devuelva la media aritmética de :grades como 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").inspect

Salida esperada:

Student 'Alice' added.
Student 'Bob' added.
Grade 90 added for 'Alice'.
Grade 80 added for 'Alice'.
85.0
0
Student 'Charlie' not found.
nil

Hoja 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 .find para localizar un registro; devuelve nil si no se encuentra.
  • Protégete contra una colección vacía con .empty? antes de dividir.
  • Usa .to_f en 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
quiz iconPonte a prueba

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