Определить номер треугольника, имеющего наибольшую высоту (переписать с паскаля на Си) - 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 для поиска максимального элемента в массиве.
- Создаем массив из трех треугольников и массив для хранения их высот.
- В цикле запрашиваем данные для каждого треугольника, проверяем корректность ввода и вычисляем высоту.
- Находим максимальную высоту и выводим номер соответствующего треугольника.