Menu
Coddy logo textTech

Итоги: Калькулятор фигур

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

challenge icon

Задание

Легко

Давайте создадим калькулятор фигур, который объединит всё, что вы узнали о полиморфизме. Вы создадите абстрактный класс Shape и реализуете конкретные фигуры, вычисляющие их area и perimeter, доступные через общий интерфейс.

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

  • Shape.h: Определите абстрактный класс Shape, который служит шаблоном для всех фигур. Ваш базовый класс должен содержать:
    • защищённый член std::string name для идентификации фигуры
    • constructor, который инициализирует имя
    • pure virtual методы area() и perimeter(), возвращающие double
    • метод getName(), возвращающий имя фигуры
    • виртуальный destructor
  • Circle.h: Реализуйте класс Circle, наследующий от Shape:
    • закрытый член double radius
    • constructor, принимающий радиус (установите имя в "Circle")
    • Реализуйте area() с использованием formula: 3.14159 * radius * radius
    • Реализуйте perimeter() с использованием: 2 * 3.14159 * radius
  • Rectangle.h: Реализуйте класс Rectangle, наследующий от Shape:
    • закрытые члены double width и double height
    • constructor, принимающий width и height (установите имя в "Rectangle")
    • Реализуйте area() как width * height
    • Реализуйте perimeter() как 2 * (width + height)
  • main.cpp: Read четыре inputs (каждый в отдельной строке):
    1. Радиус Circle (double)
    2. width Rectangle (double)
    3. height Rectangle (double)
    4. Радиус второй Circle (double)

    Create все три фигуры dynamically и сохраните их в array указателей Shape*. Выполните Loop по array и для each фигуры print её информацию в следующем формате:

    <name>:
      Area: <area>
      Perimeter: <perimeter>

    Print blank line between каждой фигурой. Выполните Clean динамически allocated objects после завершения работы.

Например, при inputs 5, 4, 6 и 3:

Circle:
  Area: 78.5397
  Perimeter: 31.4159

Rectangle:
  Area: 24
  Perimeter: 20

Circle:
  Area: 28.2743
  Perimeter: 18.8495

Обратите внимание, как одна и та же логика printShapeInfo работает с любым типом фигуры. В этом заключается сила полиморфизма. Ваш код обрабатывает Circle и Rectangle одинаково через интерфейс Shape, а each фигура знает, как вычислять собственные измерения. Используйте ключевое слово override во всех переопределённых методах, чтобы обеспечить корректные сигнатуры функций.

Попробуйте сами

#include <iostream>
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"

using namespace std;

int main() {
    // Считать входные данные
    double circleRadius1, rectWidth, rectHeight, circleRadius2;
    cin >> circleRadius1;
    cin >> rectWidth;
    cin >> rectHeight;
    cin >> circleRadius2;

    // TODO: Создать массив указателей Shape* с 3 элементами
    // Shape* shapes[3];

    // TODO: Создать фигуры динамически и сохранить в массив
    // shapes[0] = new Circle(...);
    // shapes[1] = new Rectangle(...);
    // shapes[2] = new Circle(...);

    // TODO: Пройти по массиву и вывести информацию о каждой фигуре
    // Формат:
    // <name>:
    //   Area: <area>
    //   Perimeter: <perimeter>
    // (пустая строка между фигурами, но не после последней)

    // TODO: Очистить динамически выделенные объекты
    // delete shapes[i];

    return 0;
}

Все уроки раздела Объектно-ориентированное программирование

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