מחשבון שטח צורות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 61 מתוך 61.
אתגר
קלהאתגר האחרון הזה משלב 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}"
}
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין