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
Вывод проверяющей программы:
Неправильный ответ!
Захотелось извращений :)
#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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP