Определить номер треугольника, имеющего наибольшую высоту (переписать с паскаля на Си) - C (СИ)
Формулировка задачи:
Дорогие и уважаемые люди которые понимают язык СИ!!!!помогите пожалуйста перевести эту программу на Си!!!!а то я Си не понимаю....Заранее огромное спасибо)))
Код Pascal
uses crt; const nmax=20; type point=record {точка} x,y:real; end; treg=record{треушольник} a,b,c:point; end; function MaxH(t:treg):real;{находим макс. высоту в треугольнике} var s,da,db,dc,mn:real; begin {найдем площадь} s:=abs((t.a.x-t.c.x)*(t.b.y-t.c.y)-(t.b.x-t.c.x)*(t.a.y-t.c.y)); {найдем длины сторон} da:=sqrt(sqr(t.a.x-t.b.x)+sqr(t.a.y-t.b.y)); db:=sqrt(sqr(t.b.x-t.c.x)+sqr(t.b.y-t.c.y)); dc:=sqrt(sqr(t.c.x-t.a.x)+sqr(t.c.y-t.a.y)); {найдем меньшую сторону, высота к ней наибольшая} if da<db then mn:=da else mn:=db; if dc<mn then mn:=dc; MaxH:=s/mn;{значение высоты} end; var t:array[1..nmax] of treg; n,i,imx:byte; mx:real; begin clrscr; repeat write('Количество треугольников до ',nmax,' n='); readln(n); until n in [1..nmax]; writeln('Введите координаты вершин треугольников:'); for i:=1 to n do begin writeln('Треугольник ',i); writeln('Вершина 1:'); readln(t[i].a.x,t[i].a.y); writeln('Вершина 2:'); readln(t[i].b.x,t[i].b.y); writeln('Вершина 3:'); readln(t[i].c.x,t[i].c.y); end; clrscr; writeln('Исходные данные:'); writeln('-------------------------------------------------------'); writeln('| N | x1 | y1 | x2 | y2 | x3 | y3 | H |'); writeln('-------------------------------------------------------'); for i:=1 to n do begin write('|',i:2,' |',t[i].a.x:6:1,'|',t[i].a.y:6:1,'|',t[i].b.x:6:1,'|',t[i].b.y:6:1); writeln('|',t[i].c.x:6:1,'|',t[i].c.y:6:1,'|',MaxH(t[i]):6:1,' |'); end; writeln('-------------------------------------------------------'); {найдем треугольник с наибольшей высотой} mx:=MaxH(t[1]); imx:=1; for i:=1 to n do if MaxH(t[i])>mx then begin mx:=MaxH(t[i]); imx:=i; end; writeln; write('Наибольшая высота=',mx:0:1,' в треугольнике номер ',imx); readln end.
если нужно то первоначальное задание к паскалю было:Даны координаты вершин нескольких треугольников. Определить номер треугольника, имеющего наибольшую высоту.
Пожалуйста помогите!!!!!!!!!!!!!!!!!!!!!!!!!!!
Решение задачи: «Определить номер треугольника, имеющего наибольшую высоту (переписать с паскаля на Си)»
textual
Листинг программы
#include <stdio.h> #include <math.h> #define MIN3(a, b, c) ( ( (a) < (b) && (a) < (c) ) ? (a) : (b) < (c) ? (b) : (c) ) #define CHECK_TRIANGLE(a, b, c) ( ( (a) < (b) + (c) ) && ( (b) < (a) + (c) ) && ( (c) < (a) + (b) ) ) void flush_input(void) { char c; while ( scanf("%c", &c) == 1 && c != '\n' ) ; } typedef struct POINT { double x; double y; } point_t; typedef struct TRIANGLE { point_t a; point_t b; point_t c; double ab; double bc; double ac; } triangle_t; double distance(const point_t * a, const point_t * b) { return sqrt(pow(b->x - a->x, 2.0) + pow(b->y - a->y, 2.0)); } double height(const triangle_t * t) { double p = (t->ab + t->bc + t->ac) / 2.0; return (2.0 / MIN3(t->ab, t->bc, t->ac)) * sqrt(p * (p - t->ab) * (p - t->bc) * (p - t->ac)); } int get_triangle(triangle_t * t) { printf("Point A\n"); printf("X = "); if ( scanf("%lf", &(t->a.x)) != 1 ) return 0; printf("Y = "); if ( scanf("%lf", &(t->a.y)) != 1 ) return 0; printf("Point B\n"); printf("X = "); if ( scanf("%lf", &(t->b.x)) != 1 ) return 0; printf("Y = "); if ( scanf("%lf", &(t->b.y)) != 1 ) return 0; printf("Point C\n"); printf("X = "); if ( scanf("%lf", &(t->c.x)) != 1 ) return 0; printf("Y = "); if ( scanf("%lf", &(t->c.y)) != 1 ) return 0; t->ab = distance(&(t->a), &(t->b)); t->bc = distance(&(t->b), &(t->c)); t->ac = distance(&(t->a), &(t->c)); return CHECK_TRIANGLE(t->ab, t->bc, t->ac); } double * max_element(const double * pArr, const size_t count) { return ( count < 2 ) ? (double*)pArr : ( *pArr < *(pArr + count - 1) ) ? max_element(pArr + 1, count - 1) : max_element(pArr, count - 1); } #define NUM_TRIANGLES 3 int main(void) { triangle_t triangles[NUM_TRIANGLES]; double heights[NUM_TRIANGLES]; size_t i; for ( i = 0; i < NUM_TRIANGLES; ++i ) { printf("Triangle #%u:\n", i + 1); while ( ! get_triangle(&triangles[i]) ) { fprintf(stderr, "Wrong input or data!\n"); flush_input(); } heights[i] = height(&triangles[i]); } printf("Maximum height have triangle #%u\n", max_element(heights, NUM_TRIANGLES) - heights + 1); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
для работы с I/O, для работы с математическими функциями. - Определяем макросы:
- MIN3(a, b, c) вычисляет минимальное значение из трех чисел a, b и c.
- CHECK_TRIANGLE(a, b, c) проверяет, является ли треугольник со сторонами a, b и c действительным (т.е. выполняется ли условие существования треугольника).
- Создаем функцию flush_input для очистки буфера ввода от лишних символов.
- Определяем структуру point_t для представления точки в двумерном пространстве.
- Определяем структуру triangle_t для представления треугольника, содержащего три точки и длины сторон между ними.
- Реализуем функцию distance для вычисления расстояния между двумя точками в двумерном пространстве с использованием формулы расстояния между двумя точками на плоскости.
- Реализуем функцию height для вычисления высоты треугольника, проведенной к стороне, с использованием формулы площади треугольника по половине произведения длин двух сторон на синус угла между ними.
- Реализуем функцию get_triangle для получения данных о треугольнике от пользователя и заполнения структуры triangle_t.
- Реализуем функцию max_element для поиска максимального элемента в массиве.
- Создаем массив из трех треугольников и массив для хранения их высот.
- В цикле запрашиваем данные для каждого треугольника, проверяем корректность ввода и вычисляем высоту.
- Находим максимальную высоту и выводим номер соответствующего треугольника.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д