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.
Thử thách
Trung bìnhThê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
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ý
1Tìm hiểu sâu về chuỗi
Tổng quan về phương thức chuỗiNội suy chuỗiDuyệt qua chuỗiTách và nối chuỗiÔn tập: Đan chuỗi4Khối lệnh, Proc và lambda
Khối lệnh là gì?do..end và dấu ngoặc nhọnTừ khóa yieldTham số của khối lệnhProc và lambdaÔn tập: bộ lặp tùy chỉnh7Hash, phần 2
Hash.new với giá trị mặc địnhLặp qua HashHash lồng nhauGộp và chuyển đổiÔn tập: Bộ đếm tần suất10Dự án: Hồ sơ học sinh
Tổng quan dự ánThêm học sinh2Phạm vi
Phạm vi là gì?Các phương thức của phạm viPhạm vi trong case / whenÔn tập: luyện tập với phạm vi5Sức mạnh của Enumerable
select và rejectNối chuỗi mapreduce / injectcount, all?, any?, none?group_by và partitionsort_by, min_by, max_byÔn tập: quy trình dữ liệuTự luyện tập: Trình biên dịch Ruby online