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 construir 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 perímetro, todas acessíveis através de uma interface comum.

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

  • Shape.h: Defina uma classe abstrata Shape que serve como modelo para todas as formas. Sua classe base deve ter:
    • Um membro protegido std::string name para identificar a forma
    • Um construtor que inicializa o nome
    • Métodos virtuais puros area() e perimeter() que retornam double
    • Um método getName() que retorna o nome da forma
    • Um destrutor virtual
  • Circle.h: Implemente uma classe Circle que herda de Shape:
    • Um membro privado double radius
    • Um construtor que recebe 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 herda de Shape:
    • Membros privados double width e double height
    • Um construtor que recebe largura e altura (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 todas 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. Limpe seus objetos alocados dinamicamente quando 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 — este é o poder do polimorfismo. Seu código processa círculos e retângulos de forma idêntica através 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: Criar um array de ponteiros Shape* com 3 elementos
    // Shape* shapes[3];

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

    // TODO: Percorrer o array e imprimir as informações de cada forma
    // Formato:
    // <name>:
    //   Area: <area>
    //   Perimeter: <perimeter>
    // (linha em branco entre as formas, mas não após a última)

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

    return 0;
}

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