Найти три треугольника самой большой площади - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Дано n точек необходимо найти три треугольника самой большой площади и вывести их координаты

Решение задачи: «Найти три треугольника самой большой площади»

textual
Листинг программы
uses crt;
const nmax=20;{максимальное количество точек}
type point=record {тип точка}
           x,y:integer;
           end;
     trg=record {тип треугольник}
         v1,v2,v3:point;{вершины}
         s:real; {площадь}
         end;
var a:array[1..nmax] of point;
    t:array[1..1140] of trg;{массив точек, максимально 20!/17!/3!=1140}
    n,m,i,j,k,imx,jmx,kmx:integer;
    x:trg;
begin
clrscr;
randomize;
{зададим количество точек}
repeat
write('Количество точек от 4 до ',nmax,' n=');
readln(n);
until n in [4..nmax];
writeln('Координаты точек');
{зададим координаты точек}
for i:=1 to n do
 begin
  a[i].x:=-10+random(21);
  a[i].y:=-10+random(21);
  write(i:2,'(',a[i].x:3,';',a[i].y:3,')  ');
  if i mod 6=0 then writeln;
 end;
writeln;
{создадим массив возможных треугольников}
m:=0;
for i:=1 to n-2 do
for j:=i+1 to n-1 do
for k:=j+1 to n do
 begin
  m:=m+1;
  t[m].v1.x:=a[i].x;
  t[m].v1.y:=a[i].y;
  t[m].v2.x:=a[j].x;
  t[m].v2.y:=a[j].y;
  t[m].v3.x:=a[k].x;
  t[m].v3.y:=a[k].y;
  t[m].s:=abs((t[m].v1.x-t[m].v3.x)*(t[m].v2.y-t[m].v3.y)-
              (t[m].v2.x-t[m].v3.x)*(t[m].v1.y-t[m].v3.y))/2;
 end;
{отсортируем его по убыванию}
for i:=1 to m-1 do
for j:=i+1 to m do
if t[i].s<t[j].s then
 begin
  x:=t[i];
  t[i]:=t[j];
  t[j]:=x;
 end;
writeln('3 треугольника самой большой площади');
{возьмем 3 первых}
for i:=1 to 3 do
 begin
  write('Площадь=',t[i].s:6:2,' координаты: (',t[i].v1.x:3,';',t[i].v1.y:3,') ');
  write('(',t[i].v2.x:3,';',t[i].v2.y:3,') ');
  writeln('(',t[i].v3.x:3,';',t[i].v3.y:3,')');
 end;
readln
end.

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

  1. Объявление переменных и типов данных: — uses crt; — const nmax=20; {максимальное количество точек} — type point=record {тип точка} x,y:integer; end; — type trg=record {тип треугольник} v1,v2,v3:point; {вершины} s:real; {площадь} end; — var a:array[1..nmax] of point; {массив точек} — var t:array[1..1140] of trg; {массив возможных треугольников, максимально 20!/17!/3!=1140} — var n,m,i,j,k,imx,jmx,kmx:integer; — var x:trg;
  2. Задание количества точек: — repeat write('Количество точек от 4 до ',nmax,' n='); readln(n); until n in [4..nmax]; writeln('Координаты точек');
  3. Задание координат точек: — for i:=1 to n do begin a[i].x:=-10+random(21); a[i].y:=-10+random(21); write(i:2,'(',a[i].x:3,';',a[i].y:3,')  '); if i mod 6=0 then writeln; end; writeln;
  4. Создание массива возможных треугольников: — m:=0; — for i:=1 to n-2 do for j:=i+1 to n-1 do for k:=j+1 to n do begin m:=m+1; t[m].v1.x:=a[i].x; t[m].v1.y:=a[i].y; t[m].v2.x:=a[j].x; t[m].v2.y:=a[j].y; t[m].v3.x:=a[k].x; t[m].v3.y:=a[k].y; t[m].s:=abs((t[m].v1.x-t[m].v3.x)(t[m].v2.y-t[m].v3.y)-             (t[m].v2.x-t[m].v3.x)(t[m].v1.y-t[m].v3.y))/2; end;
  5. Сортировка массива треугольников по убыванию площади: — for i:=1 to m-1 do for j:=i+1 to m do if t[i].s<t[j].s then begin x:=t[i]; t[i]:=t[j]; t[j]:=x; end;
  6. Вывод трех треугольников самой большой площади: — for i:=1 to 3 do begin write('Площадь=',t[i].s:6:2,' координаты: (',t[i].v1.x:3,';',t[i].v1.y:3,') '); write('(',t[i].v2.x:3,';',t[i].v2.y:3,') '); writeln('(',t[i].v3.x:3,';',t[i].v3.y:3,')'); end;
  7. Чтение из ввода для завершения программы: — readln end.

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


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

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

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