حاسبة مساحة الأشكال
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 61 من 61.
التحدي
سهليجمع هذا التحدي النهائي بين trait وكائنات trait وتعدد الأشكال لحل مشكلة عملية: حساب المساحة الإجمالية لأشكال مختلفة مخزنة في مجموعة واحدة.
لنبنِ حاسبة لمساحة shape توضّح قوة كائنات trait وتعدد الأشكال! ستنشئ نظامًا يمكن فيه تخزين shapes مختلفة، وهي الدوائر والمربعات، معًا في مجموعة واحدة، ثم حساب total area الخاص بها من خلال واجهة موحّدة.
ستنظّم الشيفرة عبر ثلاثة ملفات:
shape.rs: عرّف traitShapeمع methodareaتُرجع قيمة من النوعf64. يحدّد هذا trait العقد الذي يجب على جميع shapes الوفاء به.shapes.rs: أنشئ structين ينفّذان trait الخاص بك. يحتويCircleعلىradius(f64)، ويحتويSquareعلىside(f64). يجب أن ينفّذ كل struct traitShapeباستخدام formula المناسبة لحسابه. بالنسبة إلى الدوائر، استخدم3.14159باعتبارها π.main.rs: استورد الوحدتين وأنشئ function باسمtotal_areaتقبل قيمة من النوعVec<Box<dyn Shape>>وتُرجع مجموع جميع المساحات. باستخدام المدخلات المقدّمة، أنشئ دائرة ومربعًا، وخزّنهما في متجه من كائنات trait، واحسب total area، ثم اطبع result.
صيغ المساحة هي:
- Circle:
3.14159 × radius × radius - Square:
side × side
يجب أن يعرض ناتجك total area لجميع shapes:
Total area: {total}على سبيل المثال، عند استخدام المدخلين 2.0 (radius الدائرة) و3.0 (side المربع):
Total area: 21.56636وذلك لأن: مساحة Circle = 3.14159 × 2² = 12.56636، ومساحة Square = 3² = 9، وTotal = 21.56636
وعند استخدام المدخلين 1.0 و4.0:
Total area: 19.14159ستتلقى مدخلين: radius الدائرة وطول side المربع (حلّل كليهما على أنهما 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}"
}
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت