Menu
CoddyTech

Học sinh đứng đầu

Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 53 trên 56.

Phương thức cuối cùng: tìm mọi học sinh có điểm trung bình cao hơn một ngưỡng nào đó.

Đây là quy trình xử lý dữ liệu ở mức tối đa: lặp qua dữ liệu, lọc theo một giá trị được tính ra, rồi trả về tên.

challenge icon

Thử thách

Trung bình

Thêm một phương thức top_students(threshold) trả về một mảng tên của những học sinh có điểm trung bình lớn hơn threshold. Tái sử dụng average_grade bên trong, đừng tính lại. Bỏ qua học sinh chưa có điểm (điểm trung bình của họ là 0 và sẽ không vượt qua bất kỳ ngưỡng dương nào).

Tên sẽ xuất hiện theo thứ tự được thêm vào; nếu không có ai đạt yêu cầu, hãy trả về [].

Thay khối kiểm thử bằng:

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

Đầu ra dự kiến kết thúc bằng:

["Alice"]
["Alice", "Bob", "Cara"]
[]

Tự làm thử

$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

# TODO: def top_students(threshold), tên của những học sinh có 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
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng xử lý

Tự luyện tập: Trình biên dịch Ruby online