Средний балл
Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 51 из 56.
Добавьте метод, который возвращает средний балл оценок студента — именно для такого рода итоговых вычислений и был создан Enumerable.
Обратите внимание на два пограничных случая: студент не существует и у студента еще нет оценок.
Задание
ЛегкоДобавьте метод average_grade(name), который:
- Выводит
Student '<name>' not found.и возвращаетnil, если имя не существует. - Возвращает
0, если студент существует, но у него нет оценок. - В противном случае возвращает среднее арифметическое
:gradesв виде 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Ожидаемый вывод:
Student 'Alice' added.
Student 'Bob' added.
Grade 90 added for 'Alice'.
Grade 80 added for 'Alice'.
85.0
0
Student 'Charlie' not found.
nilШпаргалка
Обработка пограничных случаев при вычислении средних значений из коллекции:
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
- Используйте
.findдля поиска записи; возвращаетnil, если она не найдена. - Защититесь от пустой коллекции с помощью
.empty?перед делением. - Используйте
.to_fдля суммы (или размера), чтобы обеспечить результат типа Float.
Попробуйте сами
$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), обрабатывает отсутствие студента, пустые оценки, возвращает среднее значение 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Обзор методов строкИнтерполяция строкИтерация по строкамSplit и JoinИтоги — String Weaver4Блоки, Proc и лямбды
Что такое блок?do..end против фигурных скобокКлючевое слово yieldПараметры блокаProc и лямбдыИтоги: пользовательский итератор7Хеши. Часть 2
Hash.new со значениями по умолчаниюИтерация по хешамВложенные хешиСлияние и преобразованиеИтоги — счетчик частоты10Проект — Учёт студентов
Обзор проектаДобавить студента2Диапазоны
Что такое диапазон?Методы диапазоновДиапазоны в Case / WhenПовторение — практика по диапазонам5Мощь Enumerable
Select и RejectЦепочки MapReduce / Injectcount, all?, any?, none?group_by и partitionsort_by, min_by, max_byИтоги — Data Pipeline8Продвинутые условные конструкции
Case с классами и RegexМножественные значения в whenТернарный операторОднострочные if / unlessПовторение: Классификатор оценок