Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <malloc.h>
- #include <math.h>
- #include <iostream>
- using namespace std;
- double Perimeter(int, int, int, int, int, int); //расчет периметра треугольника
- int** File_Input(int&, int&, int**); //файловый ввод координат
- double Perebor(int**, int); //перебор возможных треугольников, исключающий повторения
- void Free_Array(int &, int**); //освобождение памяти
- void dot(int, int, int, int, int, int, ofstream &out); //вывод по часовой стрелке
- int main()
- {
- int** N = NULL;
- int n = 0, m = 0, menu = 0;
- double minimal = 0;
- do
- {
- cout << "Enter coordinates(File input) - 1" << endl;
- cout << "Count minimal perimeter - 2" << endl;
- cout << "Exit - 0" << endl;
- cin >> menu;
- system("cls");
- switch (menu)
- {
- case 1:
- {
- N = File_Input(n, m, N);
- break;
- }
- case 2:
- {
- minimal = Perebor(N, n);
- break;
- }
- case 0:
- {
- break;
- }
- default:
- {
- cout << "ERROR!" << endl;
- break;
- }
- }
- } while (menu != 0);
- Free_Array(n, N);
- system("pause");
- return 0;
- }
- double Perimeter(int x1, int y1, int x2, int y2, int x3, int y3) //расчет периметра треугольника
- {
- double k = (y2 - y1) / (x2 - x1),
- b = (x2*y1 - x1 * y2) / (x2 - x1),
- k1 = (y3 - y1) / (x3 - x1),
- b1 = (x3*y1 - x1 * y3) / (x3 - x1),
- R = 0;
- if (b == b1 && k == k1)
- R = -1;
- else
- {
- if (((x1 == x2) && (y1 == y2)) || ((x1 == x3) && (y1 == y3)) || ((x3 == x2) && (y3 == y2)))
- R = -1;
- else
- {
- double a, b, c;
- a = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
- b = sqrt(pow(x3 - x1, 2) + pow(y3 - y1, 2));
- c = sqrt(pow(x3 - x2, 2) + pow(y3 - y2, 2));
- R = a + b + c;
- }
- }
- return (R);
- }
- int** File_Input(int &n, int &m, int **points) //файловый ввод координат
- {
- int i = 0, j = 0;
- int numbers = 0;
- int temp;
- ifstream in;
- in.open("points.txt", ios_base::in);
- if (in)
- {
- int spaces = 0;
- char ch = '0';
- while (!in.eof() && (ch != '\n')) //подсчет числа пробелов между числами
- {
- ch = in.get();
- if (ch == ' ')
- spaces++;
- }
- in.clear();
- in.seekg(0, in.beg);
- while (!in.eof()) //подсчет количества чисел в файле
- {
- in >> temp;
- numbers++;
- }
- in.clear();
- in.seekg(0, in.beg);
- n = numbers / (spaces + 1); //расчет кол-ва строк
- m = spaces + 1; //расчет кол-ва столбцов
- points = (int **)malloc(n * sizeof(int *)); //выделение памяти под двумерный массив int
- for (i = 0; i < n; i++)
- *(points + i) = (int *)malloc(m * sizeof(int));
- for (int i = 0; i < n; i++) //чтение массива из файла
- for (int j = 0; j < m; j++)
- in >> *(*(points + i) + j);
- cout << "Entered coordinates:" << endl;
- for (int i = 0; i < n; i++) //вывод массива
- {
- for (int j = 0; j < m; j++)
- cout << *(*(points + i) + j) << " ";
- cout << endl;
- }
- in.close(); //закрытие текстового файла
- }
- else
- cout << "ERROR! File failed to open!" << endl;
- return(points);
- }
- double Perebor(int** mas, int n) //перебор возможных треугольников, исключающий повторения
- {
- int num = 0, k = 0, i1 = 0, j1 = 0, k1 = 0;
- double P = 0, min = 0;
- ofstream out;
- out.open("result.txt", ios_base::out);
- for (int i = 0; i < (n - 2); i++)
- {
- for (int j = (i + 1); j < (n - 1); j++)
- {
- for (k = (j + 1); k < n; k++)
- {
- P = Perimeter(*(*(mas + i) + 0), *(*(mas + i) + 1), *(*(mas + j) + 0), *(*(mas + j) + 1), *(*(mas + k) + 0), *(*(mas + k) + 1)); //вывов функции для вычисления периметра
- if (P == -1)
- {
- cout << "Unable to make triangle!" << endl;
- }
- else
- {
- cout << "Perimeter" << (num + 1) << ":" << P << endl;
- num++;
- if (num == 1)
- min = P;
- if ((P < min) || (num == 1))
- {
- min = P;
- i1 = i;
- j1 = j;
- k1 = k;
- }
- }
- }
- }
- }
- cout << endl;
- cout << "Minimal perimeter: " << min << endl;
- dot(*(*(mas + i1) + 0), *(*(mas + i1) + 1), *(*(mas + j1) + 0), *(*(mas + j1) + 1), *(*(mas + k1) + 0), *(*(mas + k1) + 1), out);
- out.close();
- return(min);
- }
- void Free_Array(int &rows, int** arr) //освобождение памяти
- {
- for (int i = 0; i < rows; i++)
- free(*(arr + i));
- free(arr);
- }
- void dot(int x1, int y1, int x2, int y2, int x3, int y3, ofstream &out) //вывод по часовой стрелке
- {
- if (x1 >= x3 && x1 >= x2 && x3 >= x2 && y3 >= y2 && y1 <= y3) {
- out << "(" << x1 << ";" << y1 << ")" << endl << "(" << x2 << ";" << y2 << ")" << endl << "(" << x3 << ";" << y3 << ")" << endl;
- }
- else if (x1 >= x3 && x1 >= x2 && x2 >= x3 && y2 >= y3 && y1 <= y2) {
- out << "(" << x1 << ";" << y1 << ")" << endl << "(" << x3 << ";" << y3 << ")" << endl << "(" << x2 << ";" << y2 << ")" << endl;
- }
- else if (x3 >= x2 && x3 >= x1 && x1 >= x2 && y1 >= y2 && y3 <= y1) {
- out << "(" << x3 << ";" << y3 << ")" << endl << "(" << x2 << ";" << y2 << ")" << endl << "(" << x1 << ";" << y1 << ")" << endl;
- }
- else if (x3 >= x1 && x3 >= x2 && x2 >= x1 && y2 >= y1 && y3 <= y2) {
- out << "(" << x3 << ";" << y3 << ")" << endl << "(" << x1 << ";" << y1 << ")" << endl << "(" << x2 << ";" << y2 << ")" << endl;
- }
- else if (x2 >= x3 && x2 >= x1 && x3 >= x1 && y3 >= y1 && y2 <= y3) {
- out << "(" << x2 << ";" << y2 << ")" << endl << "(" << x1 << ";" << y1 << ")" << endl << "(" << x3 << ";" << y3 << ")" << endl;
- }
- else if (x2 >= x3 && x2 >= x1 && x1 >= x3 && y1 >= y3 && y2 <= y1) {
- out << "(" << x2 << ";" << y2 << ")" << endl << "(" << x3 << ";" << y3 << ")" << endl << "(" << x1 << ";" << y1 << ")" << endl;
- }
- cout << "Data has been entered in file" << endl << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement