Menu
Coddy logo textTech

Recapitulação — Calculadora de formas

Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy. Lição 63 de 104.

challenge icon

Desafio

Fácil

Vamos criar uma calculadora de formas que reúne tudo o que você aprendeu sobre polimorfismo. Você criará uma classe abstrata Shape e implementará formas concretas que calculam sua área e seu perímetro, todas acessíveis por meio de uma interface comum.

Você organizará seu código em quatro arquivos:

  • Shape.h: Defina uma classe abstrata Shape que sirva como modelo para todas as formas. Sua classe-base deve ter:
    • Um membro protegido std::string name para identificar a forma
    • Um construtor que inicialize o nome
    • Métodos virtuais puros area() e perimeter() que retornem double
    • Um método getName() que retorne o nome da forma
    • Um destrutor virtual
  • Circle.h: Implemente uma classe Circle que herde de Shape:
    • Um membro privado double radius
    • Um construtor que receba o raio (defina o nome como "Circle")
    • Implemente area() usando a fórmula: 3.14159 * radius * radius
    • Implemente perimeter() usando: 2 * 3.14159 * radius
  • Rectangle.h: Implemente uma classe Rectangle que herde de Shape:
    • Membros privados double width e double height
    • Um construtor que receba width e height (defina o nome como "Rectangle")
    • Implemente area() como width * height
    • Implemente perimeter() como 2 * (width + height)
  • main.cpp: Leia quatro entradas (cada uma em uma linha separada):
    1. Raio do círculo (double)
    2. Largura do retângulo (double)
    3. Altura do retângulo (double)
    4. Raio do segundo círculo (double)

    Crie as três formas dinamicamente e armazene-as em um array de ponteiros Shape*. Percorra o array e, para cada forma, imprima suas informações neste formato:

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

    Imprima uma linha em branco entre cada forma. Libere os objetos alocados dinamicamente ao terminar.

Por exemplo, com as entradas 5, 4, 6 e 3:

Circle:
  Area: 78.5397
  Perimeter: 31.4159

Rectangle:
  Area: 24
  Perimeter: 20

Circle:
  Area: 28.2743
  Perimeter: 18.8495

Observe como a mesma lógica de printShapeInfo funciona para qualquer tipo de forma. Esse é o poder do polimorfismo. Seu código processa círculos e retângulos de forma idêntica por meio da interface Shape, e cada forma sabe como calcular suas próprias medidas. Use a palavra-chave override em todos os métodos sobrescritos para garantir assinaturas de função corretas.

Experimente você mesmo

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

using namespace std;

int main() {
    // Ler entradas
    double circleRadius1, rectWidth, rectHeight, circleRadius2;
    cin >> circleRadius1;
    cin >> rectWidth;
    cin >> rectHeight;
    cin >> circleRadius2;

    // TODO: Crie um array de ponteiros Shape* com 3 elementos
    // Shape* shapes[3];

    // TODO: Crie as formas dinamicamente e armazene no array
    // shapes[0] = new Circle(...);
    // shapes[1] = new Rectangle(...);
    // shapes[2] = new Circle(...);

    // TODO: Percorra o array e imprima as informações de cada forma
    // Formato:
    // <name>:
    //   Área: <area>
    //   Perímetro: <perimeter>
    // (linha em branco entre as formas, mas não após a última)

    // TODO: Limpe os objetos alocados dinamicamente
    // delete shapes[i];

    return 0;
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C++ online