From cbe098fdaf6509b6a3c8bd33b3064d8f620dd58c Mon Sep 17 00:00:00 2001 From: angeld55 Date: Fri, 28 May 2021 16:45:24 +0300 Subject: sem 14 --- Sem. 14/Shapes/Circle.cpp | 22 +++++++++++++++++++ Sem. 14/Shapes/Circle.h | 15 +++++++++++++ Sem. 14/Shapes/Rectangle.cpp | 32 +++++++++++++++++++++++++++ Sem. 14/Shapes/Rectangle.h | 13 +++++++++++ Sem. 14/Shapes/Rhombus.cpp | 25 +++++++++++++++++++++ Sem. 14/Shapes/Rhombus.h | 12 ++++++++++ Sem. 14/Shapes/Shape.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++ Sem. 14/Shapes/Shape.h | 43 ++++++++++++++++++++++++++++++++++++ Sem. 14/Shapes/Square.cpp | 19 ++++++++++++++++ Sem. 14/Shapes/Square.h | 13 +++++++++++ Sem. 14/Shapes/Triangle.cpp | 30 +++++++++++++++++++++++++ Sem. 14/Shapes/Triangle.h | 14 ++++++++++++ 12 files changed, 290 insertions(+) create mode 100644 Sem. 14/Shapes/Circle.cpp create mode 100644 Sem. 14/Shapes/Circle.h create mode 100644 Sem. 14/Shapes/Rectangle.cpp create mode 100644 Sem. 14/Shapes/Rectangle.h create mode 100644 Sem. 14/Shapes/Rhombus.cpp create mode 100644 Sem. 14/Shapes/Rhombus.h create mode 100644 Sem. 14/Shapes/Shape.cpp create mode 100644 Sem. 14/Shapes/Shape.h create mode 100644 Sem. 14/Shapes/Square.cpp create mode 100644 Sem. 14/Shapes/Square.h create mode 100644 Sem. 14/Shapes/Triangle.cpp create mode 100644 Sem. 14/Shapes/Triangle.h (limited to 'Sem. 14/Shapes') diff --git a/Sem. 14/Shapes/Circle.cpp b/Sem. 14/Shapes/Circle.cpp new file mode 100644 index 0000000..3f4ac98 --- /dev/null +++ b/Sem. 14/Shapes/Circle.cpp @@ -0,0 +1,22 @@ +#include "Circle.h" + +const double PI = 3.1415; +Circle::Circle(double x, double y, double radius) : Shape(1), radius(radius) +{ + setPoint(0, x, y); +} + +double Circle::getArea() const +{ + return PI * radius * radius; +} +double Circle::getPer() const +{ + return 2 * PI * radius; +} + +Shape* Circle::clone() const +{ + Circle* copy = new Circle(*this); + return copy; +} \ No newline at end of file diff --git a/Sem. 14/Shapes/Circle.h b/Sem. 14/Shapes/Circle.h new file mode 100644 index 0000000..84380fa --- /dev/null +++ b/Sem. 14/Shapes/Circle.h @@ -0,0 +1,15 @@ +#pragma once +#include "Shape.h" + +class Circle : public Shape +{ + double radius; + +public: + Circle(double x, double y, double radius); + + double getArea() const override; + double getPer() const override; + + Shape* clone() const override; +}; \ No newline at end of file diff --git a/Sem. 14/Shapes/Rectangle.cpp b/Sem. 14/Shapes/Rectangle.cpp new file mode 100644 index 0000000..9e16b01 --- /dev/null +++ b/Sem. 14/Shapes/Rectangle.cpp @@ -0,0 +1,32 @@ +#include "Rectangle.h" + +Rectangle::Rectangle(double x1, double y1, double x3, double y3) : Shape(4) +{ + setPoint(0, x1, y1); + setPoint(1, x1, y3); + setPoint(2, x3, y3); + setPoint(3, x3, y1); +} +double Rectangle::getArea() const +{ + Shape::point p0 = getPointAtIndex(0); + Shape::point p1 = getPointAtIndex(1); + Shape::point p3 = getPointAtIndex(3); + + return p0.getDist(p1) * p0.getDist(p3); + +} +double Rectangle::getPer() const +{ + Shape::point p0 = getPointAtIndex(0); + Shape::point p1 = getPointAtIndex(1); + Shape::point p3 = getPointAtIndex(3); + + return 2*(p0.getDist(p1) + p0.getDist(p3)); +} + +Shape* Rectangle::clone() const +{ + Rectangle* copy = new Rectangle(*this); + return copy; +} \ No newline at end of file diff --git a/Sem. 14/Shapes/Rectangle.h b/Sem. 14/Shapes/Rectangle.h new file mode 100644 index 0000000..baa4cb5 --- /dev/null +++ b/Sem. 14/Shapes/Rectangle.h @@ -0,0 +1,13 @@ +#pragma once +#include "Shape.h" + +class Rectangle : virtual public Shape +{ + +public: + Rectangle(double x1, double y1, double x3, double y3); + double getArea() const override; + double getPer() const override; + + Shape* clone() const override; +}; \ No newline at end of file diff --git a/Sem. 14/Shapes/Rhombus.cpp b/Sem. 14/Shapes/Rhombus.cpp new file mode 100644 index 0000000..62a3e8c --- /dev/null +++ b/Sem. 14/Shapes/Rhombus.cpp @@ -0,0 +1,25 @@ +#include "Rhombus.h" + +Rhombus::Rhombus(double x1, double y1, double x2, double y2) : Shape(4) +{ + setPoint(0, x1, y1); + setPoint(1, x2, y2); + double sideLength = getPointAtIndex(0).getDist(getPointAtIndex(1)); + + setPoint(2, x2 + sideLength, y2); + setPoint(3, x1 + sideLength, y1); +} + +double Rhombus::getArea() const +{ + return 0.5 * getPointAtIndex(0).getDist(getPointAtIndex(2)) * getPointAtIndex(1).getDist(getPointAtIndex(3)); +} +double Rhombus::getPer() const +{ + return 4 * getPointAtIndex(0).getDist(getPointAtIndex(1)); +} +Shape* Rhombus::clone() const +{ + Rhombus* copy = new Rhombus(*this); + return copy; +} \ No newline at end of file diff --git a/Sem. 14/Shapes/Rhombus.h b/Sem. 14/Shapes/Rhombus.h new file mode 100644 index 0000000..24e5a5b --- /dev/null +++ b/Sem. 14/Shapes/Rhombus.h @@ -0,0 +1,12 @@ +#pragma once +#include "Shape.h" + +class Rhombus : virtual public Shape +{ +public: + Rhombus(double x1, double y1, double x2, double y2); + + double getArea() const override; + double getPer() const override; + Shape* clone() const override; +}; \ No newline at end of file diff --git a/Sem. 14/Shapes/Shape.cpp b/Sem. 14/Shapes/Shape.cpp new file mode 100644 index 0000000..7bc24ef --- /dev/null +++ b/Sem. 14/Shapes/Shape.cpp @@ -0,0 +1,52 @@ +#include "Shape.h" + +Shape::Shape(size_t pointsCount) : pointsCount(pointsCount) +{ + points = new point[pointsCount]; // [0,0], [0,0].... +} + +void Shape::copyFrom(const Shape& other) +{ + points = new point[other.pointsCount]; + + for (int i = 0; i < other.pointsCount; i++) + points[i] = other.points[i]; +} +void Shape::free() +{ + delete[] points; +} + +Shape::Shape(const Shape& other) +{ + copyFrom(other); +} +Shape& Shape::operator= (const Shape& other) +{ + if (this != &other) + { + free(); + copyFrom(other); + } + return *this; +} +Shape::~Shape() +{ + free(); +} + +const Shape::point& Shape::getPointAtIndex(size_t index) const +{ + if (index >= pointsCount) + throw std::exception("Invalid point index!"); + + return points[index]; +} + +void Shape::setPoint(size_t pointIndex, double x, double y) +{ + if (pointIndex >= pointsCount) + throw std::exception("Invalid point index!"); + + points[pointIndex] = point(x, y); +} diff --git a/Sem. 14/Shapes/Shape.h b/Sem. 14/Shapes/Shape.h new file mode 100644 index 0000000..caf7919 --- /dev/null +++ b/Sem. 14/Shapes/Shape.h @@ -0,0 +1,43 @@ +#pragma once +#include + +class Shape // Abstract class - no instances of Shape are allowed! +{ +protected: + struct point + { + point() :x(0), y(0){} + point(double x, double y) :x(x), y(y){} + double x; + double y; + double getDist(const point& other) const + { + int dx = x - other.x; + int dy = y - other.y; + + return sqrt(dx*dx + dy*dy); + } + }; + const point& getPointAtIndex(size_t index) const; +private: + point* points; + size_t pointsCount; + + void copyFrom(const Shape& other); + void free(); + + +public: + Shape(size_t pointsCount); + + Shape(const Shape& other); + Shape& operator=(const Shape& other); + virtual ~Shape(); //!!!!!! + + void setPoint(size_t pointIndex, double x, double y); + + virtual double getArea() const = 0; //pure virtual + virtual double getPer() const = 0; // pure virtual + + virtual Shape* clone() const = 0; // +}; \ No newline at end of file diff --git a/Sem. 14/Shapes/Square.cpp b/Sem. 14/Shapes/Square.cpp new file mode 100644 index 0000000..555c340 --- /dev/null +++ b/Sem. 14/Shapes/Square.cpp @@ -0,0 +1,19 @@ +#include "Square.h" + +Square::Square(double x, double y, double sideLength) : Rectangle(x, y, x + sideLength, y - sideLength), Rhombus(x, y, x, y - sideLength), Shape(4) +{} + +double Square::getArea() const +{ + return Rhombus::getArea(); +} +double Square::getPer() const +{ + return Rectangle::getPer(); +}; + +Shape* Square::clone() const +{ + Square* copy = new Square(*this); + return copy; +} \ No newline at end of file diff --git a/Sem. 14/Shapes/Square.h b/Sem. 14/Shapes/Square.h new file mode 100644 index 0000000..fd78bd8 --- /dev/null +++ b/Sem. 14/Shapes/Square.h @@ -0,0 +1,13 @@ +#include "Rhombus.h" +#include "Rectangle.h" + +class Square : public Rhombus, public Rectangle +{ +public: + Square(double x, double y, double sideLength); + + double getArea() const override; + double getPer() const override; + + Shape* clone() const override; +}; \ No newline at end of file diff --git a/Sem. 14/Shapes/Triangle.cpp b/Sem. 14/Shapes/Triangle.cpp new file mode 100644 index 0000000..e13d685 --- /dev/null +++ b/Sem. 14/Shapes/Triangle.cpp @@ -0,0 +1,30 @@ +#include "Triangle.h" + +Triangle::Triangle(double x1, double y1, double x2, double y2, double x3, double y3) : Shape(3) +{ + setPoint(0, x1, y1); + setPoint(1, x2, y2); + setPoint(2, x3, y3); +} +double Triangle::getArea() const +{ + Shape::point p1 = getPointAtIndex(0); + Shape::point p2 = getPointAtIndex(1); + Shape::point p3 = getPointAtIndex(2); + + return abs(p1.x*p2.y + p2.x*p3.y + p3.x*p1.y - p1.y * p2.x - p2.y*p3.x - p3.y*p1.x) / 2.00; +} +double Triangle::getPer() const +{ + Shape::point p1 = getPointAtIndex(0); + Shape::point p2 = getPointAtIndex(1); + Shape::point p3 = getPointAtIndex(2); + + return p1.getDist(p2) + p2.getDist(p3) + p3.getDist(p1); +} + +Shape* Triangle::clone() const +{ + Triangle* copy = new Triangle(*this); + return copy; +} \ No newline at end of file diff --git a/Sem. 14/Shapes/Triangle.h b/Sem. 14/Shapes/Triangle.h new file mode 100644 index 0000000..3a53901 --- /dev/null +++ b/Sem. 14/Shapes/Triangle.h @@ -0,0 +1,14 @@ +#pragma once + +#include "Shape.h" + +class Triangle : public Shape +{ + +public: + Triangle(double x1, double y1, double x2, double y2, double x3, double y3); + double getArea() const override; + double getPer() const override; + + Shape* clone() const override; +}; \ No newline at end of file -- cgit v1.3.1-23-gd82d