Найти ромб найбольшей площади с вершинами в заданном множестве точек на плоскости
Вот что получилось сделать
const n=10;
var
tochka : record
x: array [1..n] of integer;
y: array [1..n] of integer;
end;
i,v1x,v2x,v1y,v2y: integer;
i1,i2,i3,i4: integer;
d1,d2,s,max,xt,yt: real;
maxx1, maxx2, maxx3, maxx4: real;
maxy1,maxy2,maxy3,maxy4: real;
begin
for i:=1 to n do
begin
tochka.x[i]:=random(20);
tochka.y[i]:=random(20);
write(tochka.x[i]:3,' ',tochka.y[i]:3,' ');
writeln;
end;
max:=0; maxx1:=0; maxx2:=0; maxx3:=0; maxx4:=0;
s:=0; maxy1:=0; maxy2:=0; maxy3:=0; maxy4:=0;
d1:=0; v1x:=0; v1y:=0; v2x:=0; v2y:=0;
d2:=0;
xt:=0;
yt:=0;
for i1:=1 to n-3 do {так как работа идет с 4 точками ничего умнее не придумал как сделать цикл}
for i2:=i1+1 to n-2 do {c четрьмя переменными}
for i3:=i2+1 to n-1 do
for i4:=i3+1 to n do
begin
v1x:=tochka.x[i2]-tochka.x[i1]; {из 4 точек делаем 2 вектора}
v1y:=tochka.y[i2]-tochka.y[i1];
v2x:=tochka.x[i4]-tochka.x[i3];
v2y:=tochka.y[i4]-tochka.y[i3];
if (v1x*v2x+v1y*v2y)=0 then {решил воспользоваться скалярным произведением для определения }
begin {угла между векторами то есть кос 90 = 0 }
xt:=(tochka.x[i2]+tochka.x[i1])/2; {значит сумма произведений соотв. координат дает ноль}
yt:=(tochka.y[i2]+tochka.y[i1])/2; {и я предполагаю если они пересекаются под 90 гр. и делятся точкой }
{пересечения пополам то нахожу эту точку}
if (tochka.x[i4]-xt=xt-tochka.x[i3]) and (tochka.y[i4]-yt=yt-tochka.y[i3]) {и проверяю делятся ли они пополам }
then {в этой точке}
begin
d1:=sqrt(sqr(v1x)+sqr(v1y)); {нахожу длину этих векторов - они же длины диагоналей}
d2:=sqrt(sqr(v2x)+sqr(v2y));
s:=d1*d2/2; {нахожу площадь сравниваю с максимальной}
if max<s then
begin
max:=s;
maxx1:=tochka.x[i1];
maxy1:=tochka.y[i1];
maxx2:=tochka.x[i2];
maxy2:=tochka.y[i2];
maxx3:=tochka.x[i3];
maxy3:=tochka.y[i3];
maxx4:=tochka.x[i4];
maxy4:=tochka.y[i4];
end;
end;
end;
end;
writeln(s);
write('Точки A B C D задающие ромб ',maxx1,' ',maxy1,' ',maxx2,' ',maxy2,' ',maxx3,' ',maxy3,' ',maxx4,' ',maxy4)
readln;
end.
Первое, что бросается в глаза - ты неправильно трактуешь тип tochka.
Нужно делать так:
type
tTochka = record
x,y: integer
end;
var
Tochka: array[1..n]of tTochka;
Насчет рэндома и срт я внял, но эта ж прога как бы для себя.. мне так проще... Но как бы дело не в них..убрать их не долго... меня просто интересовал сам принцип решения. Является ли он правильным или есть какие то более легкие пути
Добавлено через 6 мин.
код немного подправил. убрал срт и добавил константу.
Рустам, а теперь внимательно перечитай задание, и посмотри, что от тебя требовалось найти. И что будет распечатано в результате работы программы тоже посмотри...
Это первое. Второе - уже говорили, но я повторю еще раз: не хочешь проблем в дальнейшем - привыкай сразу инициализировать все переменные. Попробую сейчас найти ту тему, где автор жаловался, что пока все было в программе - работало, как только перенес в функцию - работать перестало. Именно по вышеуказанной причине...
Lapp, c типом для точек разобрался, но я пока оставлю как есть. для следующей программы обязательно учту.
volvo, дописал то, что необходимо найти и вывести.
Если я правильно понял тебя, то надо было мне в начале обнулить все переменные. (вроде ты сказал не рассчитывать на компилятор)
П.С. Стараюсь вникать в ваши советы... Не ругайтесь сильно