Notendurchschnitt
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy — Lektion 51 von 56.
Fügen Sie eine Methode hinzu, die den Durchschnitt der Noten eines Schülers zurückgibt – genau die Art von zusammenfassender Berechnung, für die Enumerable entwickelt wurde.
Achten Sie auf zwei Sonderfälle: Der Student existiert nicht und der Student hat noch keine Noten.
Aufgabe
EinfachFügen Sie eine Methode average_grade(name) hinzu, die:
Student '<name>' not found.ausgibt undnilzurückgibt, wenn der Name nicht existiert.0zurückgibt, wenn der Student existiert, aber keine Noten hat.- Andernfalls das arithmetische Mittel von
:gradesals Float zurückgibt.
Ersetzen Sie den Testblock durch:
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").inspectErwartete Ausgabe:
Student 'Alice' added.
Student 'Bob' added.
Grade 90 added for 'Alice'.
Grade 80 added for 'Alice'.
85.0
0
Student 'Charlie' not found.
nilSpickzettel
Behandeln Sie Sonderfälle bei der Berechnung von Durchschnitten aus einer Sammlung:
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
- Verwenden Sie
.find, um einen Datensatz zu finden; gibtnilzurück, wenn nichts gefunden wurde. - Sichern Sie sich mit
.empty?gegen eine leere Sammlung ab, bevor Sie dividieren. - Verwenden Sie
.to_fauf die Summe (oder Größe), um ein Float-Ergebnis sicherzustellen.
Probier es selbst
$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), behandelt fehlende Schüler, leere Noten, gibt Float-Durchschnitt zurück
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
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmfluss
1Strings im Detail
String-Methoden im ÜberblickString-InterpolationIterieren über StringsSplit und JoinRückblick – String Weaver4Blöcke, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas yield-SchlüsselwortBlock-ParameterProcs und LambdasZusammenfassung – Eigener Iterator7Hashes Teil 2
Hash.new mit StandardwertenIterieren über HashesVerschachtelte HashesZusammenführen und TransformierenRückblick – Häufigkeitszähler10Projekt - Studentenverwaltung
ProjektübersichtStudent hinzufügen5Enumerable-Kraftpaket
Select und RejectMap-VerkettungReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Data Pipeline8Fortgeschrittene Entscheidungslogik
Case mit Klassen & RegexMulti-Value whenTernärer OperatorInline if / unlessRückblick – Noten-Klassifizierer