Menu
Coddy logo textTech

Ripasso: calcolatrice di forme

Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 63 di 104.

challenge icon

Sfida

Facile

Costruiamo un calcolatore di forme che riunisce tutto ciò che hai imparato sul polimorfismo. Creerai una classe astratta Shape e implementerai forme concrete che calcolano la loro area e il loro perimetro, tutte accessibili tramite un'interfaccia comune.

Organizzerai il codice in quattro file:

  • Shape.h: definisci una classe astratta Shape che funge da modello per tutte le forme. La classe base deve avere:
    • Un membro std::string name protetto per identificare la forma
    • Un costruttore che inizializza il nome
    • I metodi virtuali puri area() e perimeter(), che restituiscono double
    • Un metodo getName() che restituisce il nome della forma
    • Un distruttore virtuale
  • Circle.h: implementa una classe Circle che eredita da Shape:
    • Un membro privato double radius
    • Un costruttore che riceve il raggio (imposta il nome a "Circle")
    • Implementa area() usando la formula: 3.14159 * radius * radius
    • Implementa perimeter() usando: 2 * 3.14159 * radius
  • Rectangle.h: implementa una classe Rectangle che eredita da Shape:
    • I membri privati double width e double height
    • Un costruttore che riceve larghezza e altezza (imposta il nome a "Rectangle")
    • Implementa area() come width * height
    • Implementa perimeter() come 2 * (width + height)
  • main.cpp: leggi quattro valori (ciascuno su una riga separata):
    1. Raggio del cerchio (double)
    2. Larghezza del rettangolo (double)
    3. Altezza del rettangolo (double)
    4. Raggio del secondo cerchio (double)

    Crea tutte e tre le forme dinamicamente e memorizzale in un array di puntatori Shape*. Scorri l'array e, per ogni forma, stampa le sue informazioni in questo formato:

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

    Stampa una riga vuota tra una forma e l'altra. Al termine, libera gli oggetti allocati dinamicamente.

Per esempio, con gli input 5, 4, 6 e 3:

Circle:
  Area: 78.5397
  Perimeter: 31.4159

Rectangle:
  Area: 24
  Perimeter: 20

Circle:
  Area: 28.2743
  Perimeter: 18.8495

Nota come la stessa logica printShapeInfo funziona per qualsiasi tipo di forma. Questo è il potere del polimorfismo. Il tuo codice elabora cerchi e rettangoli allo stesso modo tramite l'interfaccia Shape, e ogni forma sa come calcolare le proprie misure. Usa la parola chiave override su tutti i metodi sovrascritti per assicurarti che le firme delle funzioni siano corrette.

Provalo tu

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

using namespace std;

int main() {
    // Leggi i valori in input
    double circleRadius1, rectWidth, rectHeight, circleRadius2;
    cin >> circleRadius1;
    cin >> rectWidth;
    cin >> rectHeight;
    cin >> circleRadius2;

    // TODO: Crea un array di puntatori Shape* con 3 elementi
    // Shape* shapes[3];

    // TODO: Crea le forme dinamicamente e memorizzale nell'array
    // shapes[0] = new Circle(...);
    // shapes[1] = new Rectangle(...);
    // shapes[2] = new Circle(...);

    // TODO: Scorri l'array e stampa le informazioni di ogni forma
    // Formato:
    // <name>:
    //   Area: <area>
    //   Perimetro: <perimeter>
    // (riga vuota tra le forme, ma non dopo l'ultima)

    // TODO: Libera gli oggetti allocati dinamicamente
    // delete shapes[i];

    return 0;
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C++ online