NickAndNick

Наибольший из треугольников, образованных точками плоскости

Dec 27th, 2012
102
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. struct POINT {
  8.     double x;
  9.     double y;
  10. };
  11. typedef POINT * PPOINT;
  12.  
  13. struct TRIANGLE {
  14.     double a;
  15.     double b;
  16.     double c;
  17.     POINT first;
  18.     POINT second;
  19.     POINT third;
  20.     bool exists();
  21.     void lengths();
  22.     double area();
  23. };
  24.  
  25. double edge(const POINT, const POINT);
  26. void show(PPOINT, size_t);
  27. double max_area(TRIANGLE &, PPOINT, size_t);
  28.  
  29. int main() {
  30.     wcout.imbue(locale("rus_rus.866"));
  31.     wcout << L"\n Введите количество точек: ";
  32.     size_t size;
  33.     cin >> size;
  34.     cout << endl;
  35.  
  36.     PPOINT points = new POINT [size];
  37.  
  38.     for (size_t n = 0; n < size; n++) {
  39.         cout << " x" << n + 1 << " -> ";
  40.         cin >> points[n].x;
  41.         cout << " y" << n + 1 << " -> ";
  42.         cin >> points[n].y;
  43.         cout << endl;
  44.     } system("cls");
  45.  
  46.     show(points, size);
  47.  
  48.     TRIANGLE max_triangle;
  49.     double max = max_area(max_triangle, points, size);
  50.  
  51.     if (max) {
  52.         wcout << L"  Наибольшую площадь имеет треугольник образованный точками с координатами:\n\n"
  53.               << L"\t\t\t\tx1 = " << max_triangle.first.x << endl
  54.               << L"\t\t\t\ty1 = " << max_triangle.first.y << endl << endl
  55.               << L"\t\t\t\tx2 = " << max_triangle.second.x << endl
  56.               << L"\t\t\t\ty2 = " << max_triangle.second.y << endl << endl
  57.               << L"\t\t\t\tx3 = " << max_triangle.third.x << endl
  58.               << L"\t\t\t\ty3 = " << max_triangle.third.y << endl << endl
  59.               << L"\t\t\tПлощадь треугольника: " << max << endl;
  60.     } else wcout << L" Недостаточно данных!\a\n";
  61.  
  62.     delete[] points;
  63.  
  64.     cin.get(); cin.get();
  65.     return 0;
  66. }
  67.  
  68. double TRIANGLE::area() {
  69.     double p = (a + b + c) / 2;
  70.     return sqrt(p * (p - a) * (p - b) * (p - c));
  71. }
  72.  
  73. bool TRIANGLE::exists() {
  74.     bool x;
  75.     double max = (a > b) ? (a > c) ? a : c : (b > c) ? b : c;
  76.     (a + b + c - max > max) ? x = true : x = false;
  77.     return x;
  78. }
  79.  
  80. void TRIANGLE::lengths() {
  81.     a = edge(first, second);
  82.     b = edge(second, third);
  83.     c = edge(third, first);
  84. }
  85.  
  86. double max_area(TRIANGLE & _tr, PPOINT _points, size_t _size) {
  87.     double max = 0;
  88.     if (_size > 2) {
  89.         double area;
  90.         TRIANGLE temp;
  91.         for (size_t f = 0; f < _size - 2; f++) {
  92.             for (size_t s = f + 1; s < _size - 1; s++) {
  93.                 for (size_t t = s + 1; t < _size; t++) {
  94.                     _tr.first = _points[f];
  95.                     _tr.second = _points[s];
  96.                     _tr.third = _points[t];
  97.                     _tr.lengths();
  98.                     area = _tr.area();
  99.                     if (_tr.exists() && area > max) {
  100.                         max = area;
  101.                         temp = _tr;
  102.                     }
  103.                 }
  104.             }
  105.         } _tr = temp;
  106.     }
  107.     return max;
  108. }
  109.  
  110. void show(PPOINT _points, size_t _size) {
  111.     streamsize w = 7;
  112.     cout << endl << "  X: ";
  113.     for (size_t n = 0; n < _size; n++) cout << setw(w) << _points[n].x;
  114.     cout << endl << "  Y: ";
  115.     for (size_t n = 0; n < _size; n++) cout << setw(w) << _points[n].y;
  116.     cout << endl << endl;
  117. }
  118.  
  119. double edge(const POINT _a, const POINT _b) {
  120.     return sqrt(pow(_a.x - _b.x, 2) + pow(_a.y - _b.y, 2));
  121. }
RAW Paste Data