Meilleurs étudiants
Fait partie de la section Logique et Flux du Journey Ruby de Coddy — leçon 53 sur 56.
Dernière méthode : trouver tous les étudiants dont la moyenne est supérieure à un certain seuil.
Voici votre pipeline de données à pleine puissance : itérer, filtrer sur une valeur dérivée, retourner les noms.
Défi
MoyenAjoutez une méthode top_students(threshold) qui renvoie un tableau de noms dont la moyenne est supérieure à threshold. Réutilisez average_grade en interne, ne recalculez pas les opérations mathématiques. Ignorez les étudiants sans notes (leur moyenne est de 0 et ne dépassera aucun seuil positif).
Les noms doivent apparaître dans l'ordre d'insertion ; si personne n'est qualifié, renvoyez [].
Remplacez le bloc de test par :
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).inspectLa sortie attendue se termine par :
["Alice"]
["Alice", "Bob", "Cara"]
[]Aide-mémoire
Utilisez top_students(threshold) pour filtrer les étudiants par note moyenne, en réutilisant average_grade :
def top_students(threshold)
$students
.select { |s| average_grade(s[:name]) > threshold }
.map { |s| s[:name] }
endLes étudiants sans notes renvoient 0 via average_grade et sont naturellement exclus par tout seuil positif.
Essayez vous-même
$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
# À FAIRE : def top_students(threshold), les noms dont average_grade > threshold
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
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et Flux
1Les chaînes de caractères en profondeur
Aperçu des méthodes de chaînesInterpolation de chaînesParcourir les chaînesSplit et JoinRécapitulatif - String Weaver4Blocs, Procs & Lambdas
Qu'est-ce qu'un bloc ?do..end vs AccoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes - Partie 2
Hash.new avec des valeurs par défautItérer sur les HashesHashes imbriquésFusion et transformationRécapitulatif - Compteur de fréquence10Projet - Dossiers étudiants
Présentation du projetAjouter un étudiant2Intervalles
Qu'est-ce qu'un intervalle ?Méthodes d'intervalleLes intervalles dans Case / WhenRécapitulatif - Pratique des intervalles5La puissance d'Enumerable
Select et RejectChaîner MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Data Pipeline