Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

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

    Создайте все три фигуры динамически и сохраните их в массиве указателей Shape*. Пройдите циклом по массиву и для каждой фигуры выведите информацию в следующем формате:

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

    Выводите пустую строку между каждой фигурой. Очистите динамически выделенные объекты по завершении.

Например, при входных данных 5, 4, 6 и 3:

Circle:
  Area: 78.5397
  Perimeter: 31.4159

Rectangle:
  Area: 24
  Perimeter: 20

Circle:
  Area: 28.2743
  Perimeter: 18.8495

Обратите внимание, как одна и та же логика вывода информации о фигуре работает для любого типа фигуры — в этом и заключается сила полиморфизма. Ваш код обрабатывает круги и прямоугольники одинаково через интерфейс Shape, и каждая фигура знает, как рассчитать свои собственные параметры. Используйте ключевое слово 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;
}

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