Найти три треугольника самой большой площади - 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.
Объяснение кода листинга программы
- Объявление переменных и типов данных: — 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;
- Задание количества точек: — 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;
- Вывод трех треугольников самой большой площади: — 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д