8.3 Наследование и полиморфизм

8.3.2 Разные фигуры — общий интерфейс

Условие

Объявите абстрактный класс Shape с публичным виртуальным деструктором и чисто виртуальным методом double area() const. Создайте классы Rectangle и Circle, хранящие размеры в закрытых полях, заданных конструкторами. Площадь прямоугольника равна произведению сторон; площадь круга вычисляется с константой PI = 3.141592653589793.

Прочитайте описания фигур и сохраните объекты в std::vector<std::unique_ptr<Shape>>. Для создания используйте std::make_unique; подключите необходимые заголовки. Последовательно вызовите area() через общий интерфейс и найдите сумму площадей. Выбор формулы по текстовому типу допускается только при создании объекта; при вычислении площадей используйте виртуальные вызовы. Ресурсы должны освобождаться автоматически.

Ограничения

Время: 2 секунды. Память: 64 МиБ. Вывод: до 2 МиБ. Язык: C++17.

Входные данные

В первой строке вводится N. Следующие N строк имеют вид RECT width height или CIRCLE radius. Ограничения: 1 ≤ N ≤ 1000, 0 < width, height, radius ≤ 1000. Размеры вещественные, содержат не более двух знаков после десятичной точки.

Выходные данные

Сначала выведите N площадей в порядке ввода, каждую с новой строки. В следующей строке выведите их сумму. Все значения выводите с шестью знаками после десятичной точки.

Примеры

Вход 1
2
RECT 2 3
CIRCLE 1
Ожидаемый выход
6.000000
3.141593
9.141593
Вход 2
1
RECT 0.50 4
Ожидаемый выход
2.000000
2.000000
Вход 3
2
CIRCLE 2
CIRCLE 1
Ожидаемый выход
12.566371
3.141593
15.707963

Пробный запуск

Код берётся из редактора. Запуск не создаёт посылку и не влияет на баллы.

Выберите пример или введите свои данные и нажмите «Запустить».

Текущая попытка

Отправьте решение. Этапы и результат появятся здесь автоматически.

Все попытки

Войдите, чтобы видеть свои попытки.

Редактор

Один файл до 64 КиБ · Tab / Shift+Tab — отступ · Esc — выход из редактора · черновик сохраняется для этого аккаунта, задачи и языка.