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

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

جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 61 من 61.

challenge icon

التحدي

سهل

يجمع هذا التحدي النهائي بين trait وكائنات trait وتعدد الأشكال لحل مشكلة عملية: حساب المساحة الإجمالية لأشكال مختلفة مخزنة في مجموعة واحدة.

لنبنِ حاسبة لمساحة shape توضّح قوة كائنات trait وتعدد الأشكال! ستنشئ نظامًا يمكن فيه تخزين shapes مختلفة، وهي الدوائر والمربعات، معًا في مجموعة واحدة، ثم حساب total area الخاص بها من خلال واجهة موحّدة.

ستنظّم الشيفرة عبر ثلاثة ملفات:

  • shape.rs: عرّف trait Shape مع method area تُرجع قيمة من النوع f64. يحدّد هذا trait العقد الذي يجب على جميع shapes الوفاء به.
  • shapes.rs: أنشئ structين ينفّذان trait الخاص بك. يحتوي Circle على radius ‏(f64)، ويحتوي Square على side ‏(f64). يجب أن ينفّذ كل struct trait Shape باستخدام 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}"
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Rust عبر الإنترنت