Menu
Coddy logo textTech

図形の面積計算機

CoddyのRustジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 61/61。

challenge icon

チャレンジ

簡単

この最後のチャレンジでは、trait、trait オブジェクト、ポリモーフィズムを組み合わせて、単一のコレクションに格納された異なる図形の合計面積を計算するという実用的な問題を解決します。

trait オブジェクトとポリモーフィズムの力を示す図形面積計算機を作りましょう!異なる図形である Circle と Square を単一のコレクションに一緒に格納し、統一されたインターフェースを通して合計面積を計算できるシステムを作成します。

コードを3つのファイルに分けて整理します。

  • shape.rs: area method を持つ Shape trait を Define します。この trait は、すべての図形が満たすべき契約を定めます。area method は f64 を returns します。
  • shapes.rs: trait を Implement する2つの struct を Create します。Circleradius(f64)を持ち、Squareside(f64)を持ちます。各 struct は、適切な面積 formula を使って Shape trait を Implement する should。Circle では、πとして 3.14159 を使用します。
  • main.rs: 両方のモジュールを読み込み、Vec<Box<dyn Shape>> を受け取り、すべての面積の sum を returns する total_area function を Create します。指定された入力を使って Circle と Square を作成し、それらを trait オブジェクトの vector に Store し、合計面積を計算して result を print します。

面積の formula は次のとおりです。

  • Circle: 3.14159 × radius × radius
  • Square: side × side

出力には、すべての図形の合計面積が表示されます。

Total area: {total}

たとえば、入力が 2.0(Circle の radius)と 3.0(Square の side)の場合:

Total area: 21.56636

これは、Circle の面積 = 3.14159 × 2² = 12.56636、Square の面積 = 3² = 9、Total = 21.56636 となるためです。

入力が 1.04.0 の場合:

Total area: 19.14159

2つの入力、つまり Circle の radius と Square の side length を受け取ります(両方を f64 として parse します)。

自分で試してみよう

mod shape;
mod shapes;

use shape::Shape;
use shapes::{Circle, Square};

// TODO: total_area 関数を実装する
// Vec&lt;Box&lt;dyn Shape&gt;&gt; を受け取り、すべての面積の合計を 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&lt;Box&lt;dyn Shape&gt;&gt; に格納する
    // TODO: total_area を呼び出し、結果を次の形式で出力する: "Total area: {total}"
}

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rustオンラインコンパイラ