حاسبة مساحة الأشكال
جزء من قسم 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 مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت