Menu
Coddy logo textTech

Podsumowanie — kalkulator kształtów

Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 63 z 104.

challenge icon

Wyzwanie

Łatwy

Stwórzmy kalkulator kształtów, który łączy wszystko, czego nauczyłeś się o polimorfizmie. Utworzysz abstrakcyjną klasę Shape i zaimplementujesz konkretne kształty, które obliczają swoje pole i obwód, a wszystko będzie dostępne za pośrednictwem wspólnego interfejsu.

Rozmieścisz kod w czterech plikach:

  • Shape.h: Zdefiniuj abstrakcyjną klasę Shape, która będzie wzorcem dla wszystkich kształtów. Twoja klasa bazowa powinna zawierać:
    • Chroniony element składowy std::string name służący do identyfikowania kształtu
    • Konstruktor inicjalizujący nazwę
    • Czysto wirtualne metody area() i perimeter(), które zwracają wartość typu double
    • Metodę getName(), która zwraca nazwę kształtu
    • Wirtualny destruktor
  • Circle.h: Zaimplementuj klasę Circle dziedziczącą po Shape:
    • Prywatny element składowy double radius
    • Konstruktor przyjmujący promień (ustawiający nazwę na "Circle")
    • Zaimplementuj area() przy użyciu wzoru: 3.14159 * radius * radius
    • Zaimplementuj perimeter() przy użyciu wzoru: 2 * 3.14159 * radius
  • Rectangle.h: Zaimplementuj klasę Rectangle dziedziczącą po Shape:
    • Prywatne elementy składowe double width i double height
    • Konstruktor przyjmujący szerokość i wysokość (ustawiający nazwę na "Rectangle")
    • Zaimplementuj area() jako width * height
    • Zaimplementuj perimeter() jako 2 * (width + height)
  • main.cpp: Wczytaj cztery wartości (każdą w osobnym wierszu):
    1. Promień okręgu (double)
    2. Szerokość prostokąta (double)
    3. Wysokość prostokąta (double)
    4. Promień drugiego okręgu (double)

    Utwórz dynamicznie wszystkie trzy kształty i przechowaj je w tablicy wskaźników typu Shape*. Przejdź pętlą przez tablicę i dla każdego kształtu wypisz jego informacje w następującym formacie:

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

    Wypisz pusty wiersz między każdym kształtem. Po zakończeniu zwolnij dynamicznie przydzielone obiekty.

Na przykład dla danych wejściowych 5, 4, 6 i 3:

Circle:
  Area: 78.5397
  Perimeter: 31.4159

Rectangle:
  Area: 24
  Perimeter: 20

Circle:
  Area: 28.2743
  Perimeter: 18.8495

Zauważ, że ta sama logika printShapeInfo działa dla dowolnego typu kształtu. Na tym polega siła polimorfizmu. Twój kod przetwarza okręgi i prostokąty w identyczny sposób za pośrednictwem interfejsu Shape, a każdy kształt sam potrafi obliczyć swoje wymiary. Użyj słowa kluczowego override dla wszystkich nadpisanych metod, aby zapewnić zgodność sygnatur funkcji.

Spróbuj swoich sił

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

using namespace std;

int main() {
    // Wczytaj dane wejściowe
    double circleRadius1, rectWidth, rectHeight, circleRadius2;
    cin >> circleRadius1;
    cin >> rectWidth;
    cin >> rectHeight;
    cin >> circleRadius2;

    // TODO: Utwórz tablicę 3 wskaźników Shape*
    // Shape* shapes[3];

    // TODO: Utwórz obiekty figur dynamicznie i umieść je w tablicy
    // shapes[0] = new Circle(...);
    // shapes[1] = new Rectangle(...);
    // shapes[2] = new Circle(...);

    // TODO: Przejdź przez tablicę i wypisz informacje o każdej figurze
    // Format:
    // <name>:
    //   Pole: <area>
    //   Obwód: <perimeter>
    // (pusta linia między figurami, ale nie po ostatniej)

    // TODO: Zwolnij pamięć zajmowaną przez dynamicznie utworzone obiekty
    // delete shapes[i];

    return 0;
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C++ online