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