Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

حاسبة مساحة الأشكال

جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 61 من 61.

challenge icon

التحدي

سهل

يجمع هذا التحدي النهائي بين السمات (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