متوسط الدرجات
جزء من قسم المنطق وتدفق العمليات في رحلة Ruby على Coddy — الدرس 51 من 56.
أضف دالة تعيد متوسط درجات الطالب، وهو بالضبط نوع الحسابات التلخيصية التي صُممت Enumerable من أجلها.
انتبه لحالتين حديتين: الطالب غير موجود، والطالب ليس لديه درجات بعد.
التحدي
سهلأضف طريقة average_grade(name) تقوم بما يلي:
- تطبع
Student '<name>' not found.وتعيدnilإذا كان الاسم غير موجود. - تعيد
0إذا كان الطالب موجوداً ولكن ليس لديه درجات. - بخلاف ذلك، تعيد المتوسط الحسابي لـ
:gradesكـ Float.
استبدل كتلة الاختبار بـ:
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المخرجات المتوقعة:
Student 'Alice' added.
Student 'Bob' added.
Grade 90 added for 'Alice'.
Grade 80 added for 'Alice'.
85.0
0
Student 'Charlie' not found.
nilورقة مرجعية
تعامل مع الحالات الاستثنائية (edge cases) عند حساب المتوسطات من مجموعة:
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
- استخدم
.findلتحديد موقع سجل؛ حيث يتم إرجاعnilإذا لم يتم العثور عليه. - تجنب الأخطاء في حال كانت المجموعة فارغة باستخدام
.empty?قبل إجراء عملية القسمة. - استخدم
.to_fعلى المجموع (أو الحجم) لضمان الحصول على نتيجة من نوع Float.
جرّب بنفسك
$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)، يعالج حالة الطالب المفقود، والدرجات الفارغة، ويعيد المتوسط كـ Float
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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق العمليات
1السلاسل النصية بعمق
نظرة عامة على دوال السلاسل النصيةتضمين النصوص (String Interpolation)التكرار عبر السلاسل النصيةالتقسيم والربط (Split و Join)مراجعة - نساج النصوص4Blocks و Procs و Lambdas
ما هو الـ Block؟do..end مقابل الأقواس { }الكلمة المفتاحية yieldمعاملات الـ BlockProcs و Lambdasمراجعة - Custom Iterator مخصص7Hashes - الجزء الثاني
Hash.new مع القيم الافتراضيةالتكرار عبر الـ Hashesالـ Hashes المتداخلةالدمج والتحويلمراجعة - عداد التكرار10مشروع - سجلات الطلاب
نظرة عامة على المشروعإضافة طالب5قوة الـ Enumerable
Select و Rejectتسلسل MapReduce / Injectcount، all?، any?، none?group_by و partitionsort_by، min_by، max_byمراجعة - Data Pipeline