tolord

Interface Shape and class Triangle : Shape

Nov 4th, 2017
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <exception>
  5.  
  6. using namespace std;
  7.  
  8. struct Shape {
  9.     virtual double area() = 0;
  10.     virtual double perimeter() = 0;
  11.     virtual string toString() = 0;
  12.     string Type() {
  13.         return type;
  14.     }
  15. protected:
  16.     string type;
  17. public:
  18.     struct Point {
  19.         string toString() {
  20.             string result = "{";
  21.             for (int i = 0; i < getDimension(); i ++) {
  22.                 result += to_string(coordinates[i]);
  23.                 if (i < getDimension() - 1) {
  24.                     result += ", ";
  25.                 }
  26.             }
  27.             result += "}";
  28.             return result;
  29.         }
  30.  
  31.         vector<double> coordinates;
  32.  
  33.         Point(vector<double> input) : coordinates (input) {}
  34.  
  35.         unsigned int getDimension() {
  36.             return coordinates.size();
  37.         }
  38.  
  39.         double distance() {
  40.             double sum = 0;
  41.             for (auto x = coordinates.begin(); x != coordinates.end(); x ++) {
  42.                 sum += pow(*x, 2);
  43.             }
  44.             return sqrt(sum);
  45.         }
  46.  
  47.         Point& operator- (Point B) {
  48.             if (B.getDimension() != getDimension()) {
  49.                 throw new exception();
  50.             }
  51.             vector<double> newCoordinates(getDimension());
  52.             for (int i = 0; i < getDimension(); i ++) {
  53.                 newCoordinates[i] = coordinates[i] - B.coordinates[i];
  54.             }
  55.             Point* result = new Point{newCoordinates};
  56.             return *result;
  57.         }
  58.  
  59.         Point& operator+ (Point B) {
  60.             if (B.getDimension() != getDimension()) {
  61.                 throw new exception();
  62.             }
  63.             vector<double> newCoordinates(getDimension());
  64.             for (int i = 0; i < getDimension(); i ++) {
  65.                 newCoordinates[i] = coordinates[i] + B.coordinates[i];
  66.             }
  67.             Point* result = new Point(newCoordinates);
  68.             return *result;
  69.         }
  70.  
  71.         Point& operator/ (double x) {
  72.             for (int i = 0; i < getDimension(); i ++) {
  73.                 coordinates[i] /= x;
  74.             }
  75.             return *this;
  76.         }
  77.  
  78.         double distance (Point B) {
  79.             return (*this - B).distance();
  80.         }
  81.     };
  82.     virtual Shape::Point center() = 0;
  83. };
  84.  
  85. struct Triangle : Shape {
  86.     string toString() {
  87.         string result = "";
  88.         result += "\nA: ";
  89.         result += A.toString();
  90.         result += "\nB: ";
  91.         result += B.toString();
  92.         result += "\nC: ";
  93.         result += C.toString();
  94.         return result;
  95.     }
  96.     Triangle(vector< vector <double> > coordinates) : A(coordinates[0]), B(coordinates[1]), C(coordinates[2]) {
  97.         if (A.getDimension() != B.getDimension() || A.getDimension() != C.getDimension()) {
  98.             throw new exception();
  99.         }
  100.         type = "Triangle";
  101.     }
  102.     double perimeter() {
  103.         return A.distance(B) + B.distance(C) + C.distance(A);
  104.     }
  105.     double area() {
  106.         double P = perimeter()/2;
  107.         return sqrt(P * (P - A.distance(B)) * (P - B.distance(C)) * (P - C.distance(A)));
  108.     }
  109.     Point center() {
  110.         return (A + B + C)/3;
  111.     }
  112. private:
  113.     Point A;
  114.     Point B;
  115.     Point C;
  116. };
  117.  
  118. int main()
  119. {
  120.     vector< vector<double> > coordinates(3);
  121.     coordinates[0] = {0, 0};
  122.     coordinates[1] = {0, 5};
  123.     coordinates[2] = {12, 0};
  124.     Triangle ABC(coordinates);
  125.     cout << ABC.Type() << ABC.toString();
  126.     cout << "\nArea: " << ABC.area();
  127.     cout << "\nPerimeter: " << ABC.perimeter();
  128.     cout << "\nCenter: " << ABC.center().toString();
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment