TransWikia.com

Вычисления площадей различных фигур C++

Stack Overflow на русском Asked on December 28, 2021

Создать базовый Kласс Shape с виртуальной функцией Area. Создать производные классы Triangle, Rectangle, Circle…

#include <iostream>
#include <fstream>
using namespace std;

class Shape
{
  public:
    string name;
    double width, height, radius;
  public:
    void set_data (double a, double b)
    {
        width = a;
        height = b;
    }
    virtual double area() = 0;
};

class Rectangle: public Shape
{
public:
    double area ()
    {
        return (width * height);
    }
};

class Triangle: public Shape
{
public:
    double area ()
    {
        return (width * height)/2;
    }
};

class Circle : public Shape
{
  public:
    double area ()
    {
        return 3.1415 * (radius * radius);
    }
};

int main()
{
    int N;
    cin >> N;

    Rectangle Rect;
    Triangle Tri;
    Circle Circ;
    string* S = new string[N];

    if (N == 1) 
    {
      cin >> Rect.name >> Rect.height >> Rect.width;
      cout << Rect.area();

      return 0;
    } 
    else
    {
        for(int i = 0; i < N; i++)
        {
            cin >> S[i];

            if (S[i] == "Rectangle")
            {
                cin >> Rect.height;
                cin >> Rect.width;
            }
            else if (S[i] == "Triangle")
            {
                cin >> Tri.height;
                cin >> Tri.width;
            }
            else if (S[i] == "Circle")
            {
                cin >> Circ.radius;
            } 
        }
    }
    cout << Rect.area() << " " << Tri.area() << " " << Circ.area();

    delete [] S;

    return 0;
}

Код работает в первых двух тестах а в третьем дает ошибку…
Нужно вводить N количество и вывести все площади в порядке возрастания…

Примеры

====== Тест #1 =======

Входные данные:

1

Rectangle 4 3

Результат работы:
12

Правильный ответ:
12

Вывод проверяющей программы:
OK

====== Тест #2 =======

Входные данные:

3

Triangle 4 6

Rectangle 2 3

Circle 3

Результат работы:
6 12 28.2735

Правильный ответ:
6 12 28.2735

Вывод проверяющей программы:
OK

====== Тест #3 =======

Входные данные:

5

Triangle 4 6

Rectangle 2 3

Circle 4

Triangle 7 11

Triangle 3 5

Результат работы:
6 7.5 50.264

Правильный ответ:
6 7.5 12 38.5 50.264

Вывод проверяющей программы:
Неправильный ответ!

One Answer

Захотелось извращений :)

#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
#include <functional>
#include <map>
#include <sstream>
#include <algorithm>

using namespace std;

class Shape
{
public:
    Shape(const vector<double>& data):data(data)
    {
    }
    virtual double area() = 0;
    virtual ~Shape(){}

    static void reg(const string& name,function<Shape*(const vector<double>&)> f)
    {
        registry.insert(make_pair(name,f));
    }
    static Shape* make(const string& s)
    {
        istringstream is(s);
        string name;
        vector<double> data;
        is >> name;
        for(double d; is >> d; data.push_back(d));
        if (auto it = registry.find(name); it != registry.end())
        {
            return it->second(data);
        }
        return nullptr;
    }
protected:
    vector<double> data;
    inline static map<string,function<Shape*(const vector<double>&)>> registry;
};

class Rectangle: public Shape
{
public:
    Rectangle(const vector<double>& data):Shape(data){}
    double area ()
    {
        return (data[0]*data[1]);
    }
    static Shape* make(const vector<double>& data)
    {
        return new Rectangle(data);
    }
};

class Triangle: public Shape
{
public:
    Triangle(const vector<double>& data):Shape(data){}
    double area ()
    {
        return (data[0]*data[1])/2;
    }
    static Shape* make(const vector<double>& data)
    {
        return new Triangle(data);
    }
};

class Circle: public Shape
{
public:
    Circle(const vector<double>& data):Shape(data){}
    double area ()
    {
        return 3.1415926*data[0]*data[0];
    }
    static Shape* make(const vector<double>& data)
    {
        return new Circle(data);
    }
};


int main(int argc, const char * argv[])
{
    Shape::reg("Rectangle",Rectangle::make);
    Shape::reg("Triangle", Rectangle::make);
    Shape::reg("Circle",      Circle::make);


    int N;
    (cin >> N).ignore(1024,'n');
    vector<double> areas;
    for(int i = 0; i < N; ++i)
    {
        string s;
        getline(cin,s);
        Shape * sh = Shape::make(s);
        if (sh) areas.push_back(sh->area());
        delete sh;
    }

    sort(areas.begin(),areas.end());

    for(auto ar: areas) cout << ar << "  ";
    cout << endl;
}

Answered by Harry on December 28, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP