IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Найти ромб найбольшей площади с вершинами в заданном множестве точек на плоскости, Помогите идеями
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Мужской

Репутация: -  1  +


Найти ромб найбольшей площади с вершинами в заданном множестве точек на плоскости
Вот что получилось сделать

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.


Вот какие успехи , направильность не проверял, грубый какой то код получился. Может я где то ошибся или возможны способы решения задачи попроще?

Сообщение отредактировано: Рустам -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Первое, что бросается в глаза - ты неправильно трактуешь тип tochka.
Нужно делать так:
type
tTochka = record
x,y: integer
end;

Тогда массив точек будет такой:
var
Tochka: array[1..n]of tTochka;

Но это не принципиально.

Дальше, видно, что ты не внял моим словам ни про ClrScr, ни про Randomize - это, конечно, обидно..
И совету volvo ты тоже не внял - делай все через константы, не должно быть никаких чисел в пределах циклов и т.п.

Перебор в четырех циклах - в принципе верное решение.




--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Мужской

Репутация: -  1  +


Насчет рэндома и срт я внял, но эта ж прога как бы для себя.. мне так проще... Но как бы дело не в них..убрать их не долго... меня просто интересовал сам принцип решения. Является ли он правильным или есть какие то более легкие пути

Добавлено через 6 мин.
код немного подправил. убрал срт и добавил константу.

Сообщение отредактировано: Рустам -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Рустам @ 27.12.2009 16:29) *
эта ж прога как бы для себя.. мне так проще...

Наоборот - проще без них.
Я не удивлюсь, если какой-то слишком рьяный преподаватель потребует очистки экрана. Помни: все, что мы тут говорим, мы говорим именно для тебя, а не для кого-то. Именно ТЕБЕ так будет проще, поверь )). Ты только старайся вникнуть.

С типом запись для точек разобрался? Это важный момент, хоть он и не влияет в данном случае на результат. В этой проге - не влияет, в других геометрических программах ты наломаешь дров, если будешь делать, как сделал. Есть точка, есть массив точек - никак иначе.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Рустам, а теперь внимательно перечитай задание, и посмотри, что от тебя требовалось найти. И что будет распечатано в результате работы программы тоже посмотри...

Это первое. Второе - уже говорили, но я повторю еще раз: не хочешь проблем в дальнейшем - привыкай сразу инициализировать все переменные. Попробую сейчас найти ту тему, где автор жаловался, что пока все было в программе - работало, как только перенес в функцию - работать перестало. Именно по вышеуказанной причине...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Мужской

Репутация: -  1  +


Lapp, c типом для точек разобрался, но я пока оставлю как есть. для следующей программы обязательно учту.
volvo, дописал то, что необходимо найти и вывести.
Если я правильно понял тебя, то надо было мне в начале обнулить все переменные. (вроде ты сказал не рассчитывать на компилятор)
П.С. Стараюсь вникать в ваши советы... Не ругайтесь сильно
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Рустам @ 27.12.2009 17:28) *
Не ругайтесь сильно
А кто ругается? no1.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 5.05.2024 6:14
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name