Menu
Coddy logo textTech

מחשבון שטח צורות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 61 מתוך 61.

challenge icon

אתגר

קל

האתגר האחרון הזה משלב traits, אובייקטי trait ופולימורפיזם כדי לפתור בעיה מעשית: חישוב השטח הכולל של צורות שונות המאוחסנות באוסף יחיד.

בואו נבנה מחשבון שטחים לצורות שמדגים את העוצמה של אובייקטי trait ופולימורפיזם! תיצרו מערכת שבה ניתן לאחסן יחד צורות שונות, עיגולים וריבועים, באוסף יחיד ולחשב את השטח הכולל שלהן באמצעות ממשק אחיד.

תארגנו את הקוד בשלושה קבצים:

  • shape.rs: הגדירו את ה-trait בשם Shape עם מתודה בשם area שמחזירה f64. ה-trait הזה מגדיר את החוזה שכל הצורות חייבות לקיים.
  • shapes.rs: צרו שני מבנים שמממשים את ה-trait שלכם. ל-Circle יש radius (f64), ול-Square יש side (f64). כל מבנה צריך לממש את ה-trait בשם Shape באמצעות נוסחת השטח המתאימה לו. עבור עיגולים, השתמשו ב-3.14159 בתור π.
  • main.rs: יבאו את שני המודולים וצרו פונקציה בשם total_area שמקבלת Vec<Box<dyn Shape>> ומחזירה את סכום כל השטחים. באמצעות הקלטים שסופקו, צרו עיגול וריבוע, אחסנו אותם בווקטור של אובייקטי trait, חשבו את השטח הכולל והדפיסו את התוצאה.

נוסחאות השטח הן:

  • Circle: 3.14159 × radius × radius
  • Square: 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}"
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Rust אונליין