平均点の計算
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 51/56。
生徒の成績の平均を返すメソッドを追加します。これはまさに Enumerable がそのために作られたような、集計計算の一種です。
2つのエッジケースに注意してください:学生が存在しない場合と、学生にまだ成績がない場合です。
チャレンジ
簡単メソッド 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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。