Menu
Coddy logo textTech

Калькулятор площади фигур

Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 61 из 61.

challenge icon

Задание

Легко

Это финальное испытание объединяет трейты, объекты трейтов и полиморфизм для решения практической задачи: вычисления общей площади различных фигур, хранящихся в одной коллекции.

Давайте создадим калькулятор площади фигур, который продемонстрирует мощь объектов трейтов и полиморфизма! Вы создадите систему, в которой различные фигуры — круги и квадраты — могут храниться вместе в одной коллекции, а их общая площадь будет вычисляться через единый интерфейс.

Вы организуете свой код в трех файлах:

  • shape.rs: Определите трейт Shape с методом area, который возвращает f64. Этот трейт устанавливает контракт, который должны выполнять все фигуры.
  • shapes.rs: Создайте две структуры, реализующие ваш трейт. Circle имеет radius (f64), а Square имеет side (f64). Каждая структура должна реализовывать трейт Shape с соответствующей формулой площади. Для кругов используйте 3.14159 в качестве π.
  • main.rs: Подключите оба модуля и создайте функцию total_area, которая принимает Vec<Box<dyn Shape>> и возвращает сумму всех площадей. Используя предоставленные входные данные, создайте круг и квадрат, сохраните их в векторе объектов трейтов, вычислите общую площадь и выведите результат.

Формулы площади:

  • Круг: 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}"
}

Все уроки раздела Object Oriented Programming