Определить номер треугольника, имеющего наибольшую высоту (переписать с паскаля на Си) - 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы: для работы с I/O, для работы с математическими функциями.
  2. Определяем макросы:
    • MIN3(a, b, c) вычисляет минимальное значение из трех чисел a, b и c.
    • CHECK_TRIANGLE(a, b, c) проверяет, является ли треугольник со сторонами a, b и c действительным (т.е. выполняется ли условие существования треугольника).
  3. Создаем функцию flush_input для очистки буфера ввода от лишних символов.
  4. Определяем структуру point_t для представления точки в двумерном пространстве.
  5. Определяем структуру triangle_t для представления треугольника, содержащего три точки и длины сторон между ними.
  6. Реализуем функцию distance для вычисления расстояния между двумя точками в двумерном пространстве с использованием формулы расстояния между двумя точками на плоскости.
  7. Реализуем функцию height для вычисления высоты треугольника, проведенной к стороне, с использованием формулы площади треугольника по половине произведения длин двух сторон на синус угла между ними.
  8. Реализуем функцию get_triangle для получения данных о треугольнике от пользователя и заполнения структуры triangle_t.
  9. Реализуем функцию max_element для поиска максимального элемента в массиве.
  10. Создаем массив из трех треугольников и массив для хранения их высот.
  11. В цикле запрашиваем данные для каждого треугольника, проверяем корректность ввода и вычисляем высоту.
  12. Находим максимальную высоту и выводим номер соответствующего треугольника.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы