図形の面積計算機
CoddyのRustジャーニー「Object Oriented Programming」セクションの一部 — レッスン 61/61。
チャレンジ
簡単この最後のチャレンジでは、トレイト、トレイトオブジェクト、そしてポリモーフィズムを組み合わせて、単一のコレクションに格納された異なる図形の合計面積を計算するという実用的な問題を解決します。
トレイトオブジェクトとポリモーフィズムの力を示す図形面積計算機を作成しましょう!円や正方形といった異なる図形を単一のコレクションにまとめて格納し、統一されたインターフェースを通じてそれらの合計面積を計算するシステムを構築します。
コードは3つのファイルに分けて構成します:
shape.rs:f64を返すareaメソッドを持つShapeトレイトを定義します。このトレイトは、すべての図形が満たすべき契約を確立します。shapes.rs: トレイトを実装する2つの構造体を作成します。Circleはradius(f64)を持ち、Squareはside(f64)を持ちます。各構造体は、適切な面積の公式を用いてShapeトレイトを実装する必要があります。円の場合、πとして3.14159を使用してください。main.rs: 両方のモジュールを取り込み、Vec<Box<dyn Shape>>を受け取ってすべての面積の合計を返すtotal_area関数を作成します。提供された入力を使用して、円と正方形を作成し、それらをトレイトオブジェクトのベクトルに格納し、合計面積を計算して結果を出力します。
面積の公式は以下の通りです:
- 円:
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.141592つの入力を受け取ります:円の半径と正方形の辺の長さです(両方を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}" の形式で出力してください
}