Advertisement
Qellex

lab 8.1 - v19

Jun 24th, 2022 (edited)
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.52 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <windows.h>
  5. #include <math.h>
  6. typedef struct {
  7. float x, y;
  8. }Point;
  9. typedef struct {
  10. Point A, B, C; // координаты вершин
  11. float a, b, c; // стороны тругольника
  12. float L, Z, G; // углы треугольника
  13. }Triangle;
  14. // вычисление стороны треугольника
  15. void dlina(Triangle* tr) {
  16. tr->a = sqrt(pow((tr->B.x - tr->A.x), 2) + pow((tr->B.y - tr->A.y), 2));
  17. tr->b = sqrt(pow((tr->C.x - tr->B.x), 2) + pow((tr->C.y - tr->B.y), 2));
  18. tr->c = sqrt(pow((tr->A.x - tr->C.x), 2) + pow((tr->A.y - tr->C.y), 2));
  19. }
  20. // вычисление площади треугольника
  21. float S(Triangle* tr) {
  22. float p = (tr->a + tr->b + tr->c) / 2;
  23. return (sqrt(p * (p - tr->a) * (p - tr->b) * (p - tr->c)));
  24. }
  25. // вычисление радиуса вписанной окружности для заданного треугольника
  26. float radius(Triangle* tr) {
  27. float p = (tr->a + tr->b + tr->c) / 2;
  28. return (sqrt(((p - tr->a) * (p - tr->b) * (p - tr->c)) / p));
  29. }
  30. // Вычисление внутреннего угла, соответствующего указанной вершине заданого треугольника
  31. void ugol(Triangle* tr) {
  32. tr->L = acos((tr->a * tr->a + tr->b * tr->b - tr->c * tr->c) / (2 * tr->a * tr->b)) *
  33. (180 / 3.1415926535);
  34. tr->Z = acos((tr->c * tr->c + tr->a * tr->a - tr->b * tr->b) / (2 * tr->a * tr->c)) *
  35. (180 / 3.1415926535);
  36. tr->G = acos((tr->c * tr->c + tr->b * tr->b - tr->a * tr->a) / (2 * tr->c * tr->b)) *
  37. (180 / 3.1415926535);
  38. }
  39. // проверка, является ли треугольник прямоугольным
  40. void proverka(Triangle* tr) {
  41. ugol(tr);
  42. if ( tr->L == 90 || tr->Z == 90 || tr->G == 90 )
  43. return;
  44. else
  45. printf("\nВнутренний угол при вершине А = %.2f, при вершине Б = %.2f, при вершине
  46. С = %.2f, радиус вписанного окружности = %.2f\n", tr->L, tr->Z, tr->G, radius(tr));
  47. }
  48. // принадлежит ли точка треугольницу
  49. int tochka(Triangle* tr, Triangle* point) {
  50. int count = 0;
  51. float x0, y0;
  52. for (int i = 1; i < 4; i++) {
  53. switch (i){
  54. case 1:
  55. x0 = point->A.x;
  56. y0 = point->A.y;
  57. break;
  58. case 2:
  59. x0 = point->B.x;
  60. y0 = point->B.y;
  61. break;
  62. case 3:
  63. x0 = point->C.x;
  64. y0 = point->C.y;
  65. break;
  66. }
  67. float a = (tr->A.x - x0) * (tr->B.y - tr->A.y) - (tr->B.x - tr->A.x) * (tr->A.y -
  68. y0);
  69. float b = (tr->B.x - x0) * (tr->C.y - tr->B.y) - (tr->C.x - tr->B.x) * (tr->B.y -
  70. y0);
  71. float c = (tr->C.x - x0) * (tr->A.y - tr->C.y) - (tr->A.x - tr->C.x) * (tr->C.y -
  72. y0);
  73. if ((a >= 0 && b >= 0 && c >= 0) || (a <= 0 && b <= 0 && c <= 0))
  74. count++;
  75. }
  76. return count;
  77. }
  78. void main() {
  79. system("chcp 1251");
  80. int n = 0; // кол-во треугольников
  81. do{
  82. puts("Введите количество треугольников");
  83. scanf_s("%d", &n);
  84. if ((n <= 0))
  85. puts("Не верный ввод");
  86. } while (n <= 0);
  87. // выделяем память
  88. Triangle* tr = (Triangle*)malloc(sizeof(Triangle) * n);
  89. // Вводим значения треугольника и проверяем их на существование
  90. for (int i = 0; i < n; i++) { do {
  91. printf("Введите координаты вершин %d треугольника через пробел(A.x A.y B.x
  92. B.y C.x C.y)\n", i+1);
  93. scanf_s("%f%f%f%f%f%f", &tr[i].A.x, &tr[i].A.y, &tr[i].B.x, &tr[i].B.y,
  94. &tr[i].C.x, &tr[i].C.y);
  95. dlina(&tr[i]);
  96. } while ((tr[i].a > tr[i].b + tr[i].c) || (tr[i].b > tr[i].a + tr[i].c) ||
  97. (tr[i].c > tr[i].b + tr[i].a));
  98. }
  99. int max = 0, name = 0; // максимальное число точек, номер треугольника
  100. // площадь треугольника, содержащего наибольшее количество вершин треугольников из
  101. набора
  102. for (int i = 0; i < n; i++) {
  103. int count = 0; // число точек в треугольнике
  104. for (int j = 0; j < n; j++) {
  105. if (i != j)
  106. count += tochka(&tr[i], &tr[j]);
  107. }
  108. if (max < count) {
  109. max = count;
  110. name = i;
  111. }
  112. }
  113. printf("Площадь треугольника, содержащего наибольшее количество вершин треугольников из
  114. набора, равна: %.2f\n", S(&tr[name]));
  115. // внутренние углы и радиусы вписанных окружностей всех непрямоугольных треугольников
  116. for (int i = 0; i < n; i++) {
  117. proverka(&tr[i]);
  118. }
  119. }
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement