حاسبة مساحة الأشكال
جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 61 من 61.
التحدي
سهليجمع هذا التحدي النهائي بين السمات (traits)، وكائنات السمات (trait objects)، وتعدد الأشكال (polymorphism) لحل مشكلة عملية: حساب المساحة الإجمالية لأشكال مختلفة مخزنة في مجموعة واحدة.
لنقم ببناء حاسبة مساحة الأشكال التي توضح قوة كائنات السمات وتعدد الأشكال! ستقوم بإنشاء نظام حيث يمكن تخزين أشكال مختلفة — الدوائر والمربعات — معاً في مجموعة واحدة وحساب مساحتها الإجمالية من خلال واجهة موحدة.
ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:
shape.rs: قم بتعريف سمةShapeمع طريقةareaالتي تعيدf64. تحدد هذه السمة العقد الذي يجب أن تلتزم به جميع الأشكال.shapes.rs: قم بإنشاء هيكلين (structs) ينفذان السمة الخاصة بك. الـCircleلديهradius(f64)، والـSquareلديهside(f64). يجب على كل هيكل تنفيذ سمةShapeباستخدام صيغة المساحة المناسبة له. بالنسبة للدوائر، استخدم3.14159كقيمة لـ π.main.rs: قم باستيراد كلا الوحدتين (modules) وأنشئ دالةtotal_areaتقبلVec<Box<dyn Shape>>وتعيد مجموع كل المساحات. باستخدام المدخلات المقدمة، أنشئ دائرة ومربعاً، وقم بتخزينهما في متجه (vector) من كائنات السمات، واحسب المساحة الإجمالية، واطبع النتيجة.
صيغ المساحة هي:
- الدائرة:
3.14159 × radius × radius - المربع:
side × side
يجب أن يعرض مخرجك المساحة الإجمالية لجميع الأشكال:
Total area: {total}على سبيل المثال، مع المدخلات 2.0 (نصف قطر الدائرة) و 3.0 (طول ضلع المربع):
Total area: 21.56636هذا لأن: مساحة الدائرة = 3.14159 × 2² = 12.56636، مساحة المربع = 3² = 9، المجموع = 21.56636
ومع المدخلات 1.0 و 4.0:
Total area: 19.14159ستتلقى مدخلين: نصف قطر الدائرة وطول ضلع المربع (قم بتحليل كليهما كـ f64).
جرّب بنفسك
mod shape;
mod shapes;
use shape::Shape;
use shapes::{Circle, Square};
// TODO: قم بتنفيذ دالة total_area
// يجب أن تقبل Vec<Box<dyn Shape>> وتعيد مجموع كل المساحات كـ f64
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
// TODO: احسب وأعد مجموع مساحات كل الأشكال
0.0
}
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let radius: f64 = input1.trim().parse().expect("Invalid number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let side: f64 = input2.trim().parse().expect("Invalid number");
// TODO: أنشئ دائرة (Circle) بنصف القطر المعطى
// TODO: أنشئ مربعاً (Square) بالضلع المعطى
// TODO: قم بتخزين كلا الشكلين في Vec<Box<dyn Shape>>
// TODO: استدعِ total_area واطبع النتيجة بالتنسيق التالي: "Total area: {total}"
}
جميع دروس Object Oriented Programming
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائط