Menu
CoddyTech

图形面积计算器

本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 61 课,共 61 课。

challenge icon

挑战

简单

这个最终挑战会综合运用 trait、trait 对象和多态来解决一个实际问题:计算存储在同一个集合中的不同形状的总面积。

让我们构建一个形状面积计算器,展示 trait 对象和多态的强大之处!你将创建一个系统,让不同的形状,也就是圆形和正方形,可以存储在同一个集合中,并通过统一的接口计算它们的总面积。

你将把代码分布在三个文件中:

  • shape.rs:定义 Shape trait,其中包含一个返回 f64 的 area 方法。这个 trait 规定了所有形状都必须遵守的约定。
  • shapes.rs:创建两个实现该 trait 的结构体。Circle 有一个 radius(f64),Square 有一个 side(f64)。每个结构体都应通过对应的面积公式实现 Shape trait。对于圆形,使用 3.14159 作为 π。
  • main.rs:引入两个模块,并创建一个 total_area 函数。该函数接收 Vec<Box<dyn Shape>>,并返回所有面积的总和。使用给定的输入创建一个圆形和一个正方形,将它们存储在一个 trait 对象向量中,计算总面积并打印结果。

面积公式如下:

  • 圆形: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}"
}

面向对象编程中的所有课

自己练习: Rust 在线编译器