En Başarılı Öğrenciler
Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 53 / 56.
Son yöntem, ortalama notu belirli bir eşiğin üzerinde olan her öğrenciyi bulun.
İşte tam gücüyle veri hattınız: yineleyin, türetilmiş bir değer üzerinden filtreleyin, isimleri döndürün.
Görev
OrtaOrtalama notu threshold değerinden daha yüksek olan isimlerin bir dizisini döndüren bir top_students(threshold) metodu ekleyin. Dahili olarak average_grade metodunu tekrar kullanın, matematiği yeniden hesaplamayın. Notu olmayan öğrencileri atlayın (ortalamaları 0'dır ve herhangi bir pozitif eşiği geçemezler).
İsimler eklenme sırasına göre görünmelidir; eğer kimse kriterleri karşılamıyorsa [] döndürün.
Test bloğunu şununla değiştirin:
add_student("Alice", 20, ["Math"])
add_student("Bob", 22, ["Biology"])
add_student("Cara", 19, ["Physics"])
add_grade("Alice", 90)
add_grade("Alice", 85)
add_grade("Bob", 70)
add_grade("Cara", 60)
puts top_students(80).inspect
puts top_students(50).inspect
puts top_students(100).inspectBeklenen çıktı şununla biter:
["Alice"]
["Alice", "Bob", "Cara"]
[]Kopya kağıdı
Ortalama nota göre öğrencileri filtrelemek için average_grade fonksiyonunu tekrar kullanarak top_students(threshold) kullanın:
def top_students(threshold)
$students
.select { |s| average_grade(s[:name]) > threshold }
.map { |s| s[:name] }
endHiç notu olmayan öğrenciler average_grade fonksiyonundan 0 döndürür ve herhangi bir pozitif eşik değeri tarafından doğal olarak hariç tutulur.
Kendin dene
$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
def average_grade(name)
unless $student_records.key?(name)
puts "Student '#{name}' not found."
return nil
end
grades = $student_records[name][:grades]
return 0 if grades.empty?
grades.sum.to_f / grades.length
end
def list_by_course(course)
$student_records.select { |_, info| info[:courses].include?(course) }.keys
end
# YAPILACAK: def top_students(threshold), average_grade > threshold olan isimler
add_student("Alice", 20, ["Math"])
add_student("Bob", 22, ["Biology"])
add_student("Cara", 19, ["Physics"])
add_grade("Alice", 90)
add_grade("Alice", 85)
add_grade("Bob", 70)
add_grade("Cara", 60)
puts top_students(80).inspect
puts top_students(50).inspect
puts top_students(100).inspect
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1Derinlemesine Stringler
String Metotlarına Genel BakışString InterpolationStringler Üzerinde GezinmeSplit ve JoinÖzet - String Weaver4Bloklar, Procs ve Lambdalar
Blok Nedir?do..end ve Süslü Parantezleryield Anahtar KelimesiBlok ParametreleriProcs ve LambdalarÖzet - Özel İteratör7Hashes Bölüm 2
Varsayılan Değerlerle Hash.newHash Yapıları Üzerinde Yinelemeİç İçe Hash YapılarıBirleştirme ve DönüştürmeÖzet - Frekans Sayacı10Proje - Öğrenci Kayıtları
Projeye Genel BakışÖğrenci Ekle5Enumerable Gücü
Select ve RejectMap ZincirlemeReduce / Injectcount, all?, any?, none?group_by ve partitionsort_by, min_by, max_byÖzet - Data Pipeline8İleri Seviye Karar Yapıları
Sınıflar ve Regex ile CaseÇok Değerli whenTernary OperatörüSatır İçi if / unlessÖzet - Not Sınıflandırıcı