Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <windows.h>
- #include <math.h>
- typedef struct {
- float x, y;
- }Point;
- typedef struct {
- Point A, B, C; // координаты вершин
- float a, b, c; // стороны тругольника
- float L, Z, G; // углы треугольника
- }Triangle;
- // вычисление стороны треугольника
- void dlina(Triangle* tr) {
- tr->a = sqrt(pow((tr->B.x - tr->A.x), 2) + pow((tr->B.y - tr->A.y), 2));
- tr->b = sqrt(pow((tr->C.x - tr->B.x), 2) + pow((tr->C.y - tr->B.y), 2));
- tr->c = sqrt(pow((tr->A.x - tr->C.x), 2) + pow((tr->A.y - tr->C.y), 2));
- }
- // вычисление площади треугольника
- float S(Triangle* tr) {
- float p = (tr->a + tr->b + tr->c) / 2;
- return (sqrt(p * (p - tr->a) * (p - tr->b) * (p - tr->c)));
- }
- // вычисление радиуса вписанной окружности для заданного треугольника
- float radius(Triangle* tr) {
- float p = (tr->a + tr->b + tr->c) / 2;
- return (sqrt(((p - tr->a) * (p - tr->b) * (p - tr->c)) / p));
- }
- // Вычисление внутреннего угла, соответствующего указанной вершине заданого треугольника
- void ugol(Triangle* tr) {
- tr->L = acos((tr->a * tr->a + tr->b * tr->b - tr->c * tr->c) / (2 * tr->a * tr->b)) *
- (180 / 3.1415926535);
- tr->Z = acos((tr->c * tr->c + tr->a * tr->a - tr->b * tr->b) / (2 * tr->a * tr->c)) *
- (180 / 3.1415926535);
- tr->G = acos((tr->c * tr->c + tr->b * tr->b - tr->a * tr->a) / (2 * tr->c * tr->b)) *
- (180 / 3.1415926535);
- }
- // проверка, является ли треугольник прямоугольным
- void proverka(Triangle* tr) {
- ugol(tr);
- if ( tr->L == 90 || tr->Z == 90 || tr->G == 90 )
- return;
- else
- printf("\nВнутренний угол при вершине А = %.2f, при вершине Б = %.2f, при вершине
- С = %.2f, радиус вписанного окружности = %.2f\n", tr->L, tr->Z, tr->G, radius(tr));
- }
- // принадлежит ли точка треугольницу
- int tochka(Triangle* tr, Triangle* point) {
- int count = 0;
- float x0, y0;
- for (int i = 1; i < 4; i++) {
- switch (i){
- case 1:
- x0 = point->A.x;
- y0 = point->A.y;
- break;
- case 2:
- x0 = point->B.x;
- y0 = point->B.y;
- break;
- case 3:
- x0 = point->C.x;
- y0 = point->C.y;
- break;
- }
- float a = (tr->A.x - x0) * (tr->B.y - tr->A.y) - (tr->B.x - tr->A.x) * (tr->A.y -
- y0);
- float b = (tr->B.x - x0) * (tr->C.y - tr->B.y) - (tr->C.x - tr->B.x) * (tr->B.y -
- y0);
- float c = (tr->C.x - x0) * (tr->A.y - tr->C.y) - (tr->A.x - tr->C.x) * (tr->C.y -
- y0);
- if ((a >= 0 && b >= 0 && c >= 0) || (a <= 0 && b <= 0 && c <= 0))
- count++;
- }
- return count;
- }
- void main() {
- system("chcp 1251");
- int n = 0; // кол-во треугольников
- do{
- puts("Введите количество треугольников");
- scanf_s("%d", &n);
- if ((n <= 0))
- puts("Не верный ввод");
- } while (n <= 0);
- // выделяем память
- Triangle* tr = (Triangle*)malloc(sizeof(Triangle) * n);
- // Вводим значения треугольника и проверяем их на существование
- for (int i = 0; i < n; i++) { do {
- printf("Введите координаты вершин %d треугольника через пробел(A.x A.y B.x
- B.y C.x C.y)\n", i+1);
- scanf_s("%f%f%f%f%f%f", &tr[i].A.x, &tr[i].A.y, &tr[i].B.x, &tr[i].B.y,
- &tr[i].C.x, &tr[i].C.y);
- dlina(&tr[i]);
- } while ((tr[i].a > tr[i].b + tr[i].c) || (tr[i].b > tr[i].a + tr[i].c) ||
- (tr[i].c > tr[i].b + tr[i].a));
- }
- int max = 0, name = 0; // максимальное число точек, номер треугольника
- // площадь треугольника, содержащего наибольшее количество вершин треугольников из
- набора
- for (int i = 0; i < n; i++) {
- int count = 0; // число точек в треугольнике
- for (int j = 0; j < n; j++) {
- if (i != j)
- count += tochka(&tr[i], &tr[j]);
- }
- if (max < count) {
- max = count;
- name = i;
- }
- }
- printf("Площадь треугольника, содержащего наибольшее количество вершин треугольников из
- набора, равна: %.2f\n", S(&tr[name]));
- // внутренние углы и радиусы вписанных окружностей всех непрямоугольных треугольников
- for (int i = 0; i < n; i++) {
- proverka(&tr[i]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement