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

Потренируйтесь самостоятельно: Онлайн-компилятор Rust