Калькулятор площади фигур
Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 61 из 61.
Задание
ЛегкоЭто финальное испытание объединяет трейты, объекты трейтов и полиморфизм для решения практической задачи: вычисления общей площади различных фигур, хранящихся в одной коллекции.
Давайте создадим калькулятор площади фигур, который продемонстрирует мощь объектов трейтов и полиморфизма! Вы создадите систему, в которой различные фигуры — круги и квадраты — могут храниться вместе в одной коллекции, а их общая площадь будет вычисляться через единый интерфейс.
Вы организуете свой код в трех файлах:
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
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player