Калькулятор площади фигур
Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 61 из 61.
Задание
ЛегкоЭто финальное испытание объединяет traits, объекты trait и полиморфизм для решения практической задачи: вычисления общего значения total area разных shapes, хранящихся в одной коллекции.
Давайте создадим калькулятор area shapes, демонстрирующий мощь объектов trait и полиморфизма! Вы создадите систему, в которой разные shapes — circle и square — могут храниться вместе в одной коллекции, а их total area вычисляться через единый интерфейс.
Вы организуете код в трёх файлах:
shape.rs: Define traitShapeс методомarea, который returns значениеf64. Этот trait устанавливает контракт, которому должны соответствовать все shapes.shapes.rs: Create две структуры, реализующие ваш trait. УCircleестьradius(f64), а уSquare—side(f64). Каждая структура должна реализовать traitShapeс соответствующей формулой 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}"
}
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust