Advertisement
Guest User

Untitled

a guest
Dec 19th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.07 KB | None | 0 0
  1. #include <fstream>
  2. #include <malloc.h>
  3. #include <math.h>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. double Perimeter(int, int, int, int, int, int); //расчет периметра треугольника
  9. int** File_Input(int&, int&, int**); //файловый ввод координат
  10. double Perebor(int**, int); //перебор возможных треугольников, исключающий повторения
  11. void Free_Array(int &, int**); //освобождение памяти
  12. void dot(int, int, int, int, int, int, ofstream &out); //вывод по часовой стрелке
  13.  
  14. int main()
  15. {
  16. int** N = NULL;
  17. int n = 0, m = 0, menu = 0;
  18. double minimal = 0;
  19. do
  20. {
  21. cout << "Enter coordinates(File input) - 1" << endl;
  22. cout << "Count minimal perimeter - 2" << endl;
  23. cout << "Exit - 0" << endl;
  24. cin >> menu;
  25.  
  26. system("cls");
  27.  
  28. switch (menu)
  29. {
  30. case 1:
  31. {
  32. N = File_Input(n, m, N);
  33. break;
  34. }
  35. case 2:
  36. {
  37. minimal = Perebor(N, n);
  38. break;
  39. }
  40. case 0:
  41. {
  42. break;
  43. }
  44. default:
  45. {
  46. cout << "ERROR!" << endl;
  47. break;
  48. }
  49. }
  50. } while (menu != 0);
  51. Free_Array(n, N);
  52. system("pause");
  53. return 0;
  54. }
  55.  
  56. double Perimeter(int x1, int y1, int x2, int y2, int x3, int y3) //расчет периметра треугольника
  57. {
  58. double k = (y2 - y1) / (x2 - x1),
  59. b = (x2*y1 - x1 * y2) / (x2 - x1),
  60. k1 = (y3 - y1) / (x3 - x1),
  61. b1 = (x3*y1 - x1 * y3) / (x3 - x1),
  62. R = 0;
  63. if (b == b1 && k == k1)
  64. R = -1;
  65. else
  66. {
  67. if (((x1 == x2) && (y1 == y2)) || ((x1 == x3) && (y1 == y3)) || ((x3 == x2) && (y3 == y2)))
  68. R = -1;
  69. else
  70. {
  71. double a, b, c;
  72. a = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
  73. b = sqrt(pow(x3 - x1, 2) + pow(y3 - y1, 2));
  74. c = sqrt(pow(x3 - x2, 2) + pow(y3 - y2, 2));
  75. R = a + b + c;
  76. }
  77. }
  78. return (R);
  79. }
  80.  
  81. int** File_Input(int &n, int &m, int **points) //файловый ввод координат
  82. {
  83. int i = 0, j = 0;
  84. int numbers = 0;
  85. int temp;
  86. ifstream in;
  87. in.open("points.txt", ios_base::in);
  88.  
  89. if (in)
  90. {
  91. int spaces = 0;
  92. char ch = '0';
  93. while (!in.eof() && (ch != '\n')) //подсчет числа пробелов между числами
  94. {
  95. ch = in.get();
  96. if (ch == ' ')
  97. spaces++;
  98. }
  99. in.clear();
  100. in.seekg(0, in.beg);
  101. while (!in.eof()) //подсчет количества чисел в файле
  102. {
  103. in >> temp;
  104. numbers++;
  105. }
  106. in.clear();
  107. in.seekg(0, in.beg);
  108.  
  109. n = numbers / (spaces + 1); //расчет кол-ва строк
  110. m = spaces + 1; //расчет кол-ва столбцов
  111.  
  112. points = (int **)malloc(n * sizeof(int *)); //выделение памяти под двумерный массив int
  113. for (i = 0; i < n; i++)
  114. *(points + i) = (int *)malloc(m * sizeof(int));
  115.  
  116. for (int i = 0; i < n; i++) //чтение массива из файла
  117. for (int j = 0; j < m; j++)
  118. in >> *(*(points + i) + j);
  119. cout << "Entered coordinates:" << endl;
  120. for (int i = 0; i < n; i++) //вывод массива
  121. {
  122. for (int j = 0; j < m; j++)
  123. cout << *(*(points + i) + j) << " ";
  124. cout << endl;
  125. }
  126. in.close(); //закрытие текстового файла
  127. }
  128. else
  129. cout << "ERROR! File failed to open!" << endl;
  130. return(points);
  131. }
  132.  
  133. double Perebor(int** mas, int n) //перебор возможных треугольников, исключающий повторения
  134. {
  135. int num = 0, k = 0, i1 = 0, j1 = 0, k1 = 0;
  136. double P = 0, min = 0;
  137. ofstream out;
  138. out.open("result.txt", ios_base::out);
  139. for (int i = 0; i < (n - 2); i++)
  140. {
  141. for (int j = (i + 1); j < (n - 1); j++)
  142. {
  143. for (k = (j + 1); k < n; k++)
  144. {
  145. P = Perimeter(*(*(mas + i) + 0), *(*(mas + i) + 1), *(*(mas + j) + 0), *(*(mas + j) + 1), *(*(mas + k) + 0), *(*(mas + k) + 1)); //вывов функции для вычисления периметра
  146. if (P == -1)
  147. {
  148. cout << "Unable to make triangle!" << endl;
  149. }
  150. else
  151. {
  152. cout << "Perimeter" << (num + 1) << ":" << P << endl;
  153. num++;
  154. if (num == 1)
  155. min = P;
  156. if ((P < min) || (num == 1))
  157. {
  158. min = P;
  159. i1 = i;
  160. j1 = j;
  161. k1 = k;
  162. }
  163. }
  164. }
  165. }
  166. }
  167. cout << endl;
  168. cout << "Minimal perimeter: " << min << endl;
  169. dot(*(*(mas + i1) + 0), *(*(mas + i1) + 1), *(*(mas + j1) + 0), *(*(mas + j1) + 1), *(*(mas + k1) + 0), *(*(mas + k1) + 1), out);
  170. out.close();
  171. return(min);
  172. }
  173.  
  174. void Free_Array(int &rows, int** arr) //освобождение памяти
  175. {
  176. for (int i = 0; i < rows; i++)
  177. free(*(arr + i));
  178. free(arr);
  179. }
  180.  
  181. void dot(int x1, int y1, int x2, int y2, int x3, int y3, ofstream &out) //вывод по часовой стрелке
  182. {
  183.  
  184. if (x1 >= x3 && x1 >= x2 && x3 >= x2 && y3 >= y2 && y1 <= y3) {
  185. out << "(" << x1 << ";" << y1 << ")" << endl << "(" << x2 << ";" << y2 << ")" << endl << "(" << x3 << ";" << y3 << ")" << endl;
  186. }
  187. else if (x1 >= x3 && x1 >= x2 && x2 >= x3 && y2 >= y3 && y1 <= y2) {
  188. out << "(" << x1 << ";" << y1 << ")" << endl << "(" << x3 << ";" << y3 << ")" << endl << "(" << x2 << ";" << y2 << ")" << endl;
  189. }
  190. else if (x3 >= x2 && x3 >= x1 && x1 >= x2 && y1 >= y2 && y3 <= y1) {
  191. out << "(" << x3 << ";" << y3 << ")" << endl << "(" << x2 << ";" << y2 << ")" << endl << "(" << x1 << ";" << y1 << ")" << endl;
  192. }
  193. else if (x3 >= x1 && x3 >= x2 && x2 >= x1 && y2 >= y1 && y3 <= y2) {
  194. out << "(" << x3 << ";" << y3 << ")" << endl << "(" << x1 << ";" << y1 << ")" << endl << "(" << x2 << ";" << y2 << ")" << endl;
  195. }
  196. else if (x2 >= x3 && x2 >= x1 && x3 >= x1 && y3 >= y1 && y2 <= y3) {
  197. out << "(" << x2 << ";" << y2 << ")" << endl << "(" << x1 << ";" << y1 << ")" << endl << "(" << x3 << ";" << y3 << ")" << endl;
  198. }
  199. else if (x2 >= x3 && x2 >= x1 && x1 >= x3 && y1 >= y3 && y2 <= y1) {
  200. out << "(" << x2 << ";" << y2 << ")" << endl << "(" << x3 << ";" << y3 << ")" << endl << "(" << x1 << ";" << y1 << ")" << endl;
  201. }
  202. cout << "Data has been entered in file" << endl << endl;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement