Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 61 из 61.

challenge icon

Задание

Легко

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

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

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

  • shape.rs: Define trait Shape с методом area, который returns значение f64. Этот trait устанавливает контракт, которому должны соответствовать все shapes.
  • shapes.rs: Create две структуры, реализующие ваш trait. У Circle есть radius (f64), а у Squareside (f64). Каждая структура должна реализовать trait Shape с соответствующей формулой area. Для circle используйте 3.14159 в качестве π.
  • main.rs: Подключите оба модуля и Create функцию total_area, которая принимает Vec<Box<dyn Shape>> и returns сумму всех значений area. Используя предоставленные входные данные, создайте circle и square, Store их в векторе объектов trait, вычислите total area и выведите result.

Формулы area таковы:

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

Ваш вывод должен отображать total area всех shapes:

Total area: {total}

Например, при входных данных 2.0 (radius circle) и 3.0 (side square):

Total area: 21.56636

Это происходит потому, что: Circle area = 3.14159 × 2² = 12.56636, Square area = 3² = 9, Total = 21.56636

А при входных данных 1.0 и 4.0:

Total area: 19.14159

Вы получите два входных значения: radius circle и длину side square (parse оба как 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