Untitled

mail@pastecode.io avatar
unknown
c_cpp
a year ago
3.6 kB
1
Indexable
Never
//============================================================================
// Name        : ex_inherit_cpp.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cmath>
#include <typeinfo>

using namespace std;

// пользователь вводит количество объектов, создать массив указателей на базовый класс
// используя элемент массива (указатель) создать объект прооизводного класса, спросив у пользователя какой именно
// ввести значения полей каждого объекта
// вывести в цикле площади всех объектов

class Shape {
public:
	virtual double Area() const = 0; // чисто виртуальные методы
	virtual double Perimeter() const = 0;

	virtual ~Shape() {

	}
};

class Rectangle: public Shape {
private:
	double a, b;
public:
	Rectangle( const double a = 0, const double b = 0 ) :
			a( a ), b( b ) {

	}
	double Area() const {
		return a * b;
	}

	double Perimeter() const {
		return 2 * ( a + b );
	}

	double getA() const {
		return a;
	}

	void setA( double a ) {
		this->a = a;
	}

	double getB() const {
		return b;
	}

	void setB( double b ) {
		this->b = b;
	}
};

class Triangle: public Shape {
private:
	double a, h;
public:
	Triangle( const double a = 0, const double h = 0 ) :
			a( a ), h( h ) {

	}
	double Area() const {
		return ( a * h ) / 2;
	}

	double Perimeter() const {
		return 2 * ( sqrt( a * a - h * h ) + 2 * a );
	}

	double getA() const {
		return a;
	}

	void setA( double a ) {
		this->a = a;
	}

	double getH() const {
		return h;
	}

	void setH( double h ) {
		this->h = h;
	}
};

class Circle: public Shape {
private:
	double r;
public:
	Circle( const double r = 0 ) :
			r( r ) {

	}
	double Area() const {
		return M_PI * r * r;
	}

	double Perimeter() const {
		return 2 * M_PI * r;
	}

	double getR() const {
		return r;
	}

	void setR( double r ) {
		this->r = r;
	}
};

int main() {
	/*Rectangle r(3, 4); // = { 3, 4 };
	 cout << r.Area() << endl;
	 Shape* sh = &r;
	 cout << sh->Perimeter() << endl;*/
	int n;
	cout << "Введите количество объектов: " << endl;
	cin >> n;

	Shape **sh = new Shape*[ n ];

	double a, b, h, r;
	for ( int i = 0; i < n; ++i ) {
		int curr = 0;
		while ( curr < 1 || curr > 3 ) {
			cout << "\nВведите " << i + 1 << " объект который хотите добавить:" << endl;
			cout << "1 - прямоугольник:" << endl;
			cout << "2 - треугольник:" << endl;
			cout << "3 - окружность:" << endl;
			cin >> curr;
		}

		if ( curr == 1 ) {
			sh[ i ] = new Rectangle();
			cout << "Введите две стороны прямоугольника: ";
			cin >> a >> b;
			Rectangle r( a, b );
		} else if ( curr == 2 ) {
			sh[ i ] = new Triangle;
			cout << "Введите основание и высоту треугольника: ";
			cin >> a >> h;
			Triangle t( a, h );
		} else {
			sh[ i ] = new Circle;
			cout << "Введите радиус окружности: ";
			cin >> r;
			Circle c( r );
		}
	}

	cout << endl;

	for ( int i = 0; i < n; ++i )
		cout << "Площадь " << i + 1 << " фигуры = " << ( *sh[ i ] ).Area() << endl;

	delete[] sh;

	return 0;
}