Найти периметр многоугольника(До 10 вводимых вершин).
---
program perimetr;
procedure delta(a,b,c,d:real; var x:real); {Процедура для подсчета расстояния между 2мя точками}
var buf:real;
begin
x:=sqrt(sqr(c-a)+sqr(d-b));
end;
var
a:array [1..10,1..3] of real;
n,i,j:integer; p,k:real;
begin
p:=0;
writeln('Vvedite kol-vo verchin(do 10)');
read(n);
for i:=1 to n do { ввод в массив, первый столбец - Х, второй столбец - У, третий столбец - расстояние между текущей и соседней точкой, которые будут рассчитаны позже}
begin
writeln('Vvedite koordinaty vershiny pod Nomerom ',i);
read(a[i,1]);
read(a[i,2]);
end;
for j:=1 to n-1 do {сортировка методом пузырька, спасибо пользователю ВиО}
for i:=1 to n-j do
if (a[i,1]<a[i+1,1]) and (a[i,2]<a[i+1,2]) then begin
k:=a[i,1]; a[i,1]:=a[i+1,1];a[i+1,1]:=k;
k:=a[i,2]; a[i,2]:=a[i+1,2];a[i+1,2]:=k;
end;
for i:=1 to n-1 do {расчет длины между точками}
begin
delta(a[i,1],a[i,2],a[i+1,1],a[i+1,2],a[i,3]);
end;
delta(a[n,1],a[n,2],a[1,1],a[1,2],a[n,3]); {расчет длины между первой и последней точкой}
for i:=1 to n do p:=p+a[i,3]; {суммирование длин}
writeln(p:6:4);
end.
----
Проблему сложно объяснить, но она заключается в сортировке. Сортирует методом пузырька, правильно, но оказывается, не так, как хотелось бы для решения задачи.
Возьмем 4 точки, т.е. квадрат (2;1),(2;3);(4;3);(4;1);
Если их ввести поочередно, то все верно и ответ равен 8.
Но если их(вершины) ввести хаотично, то должен бы сработать сортировщик. Сортировщик работает и расставляет легкие элементы выше тяжелых. В итоге, мы получаем такой порядок: (2;1),(2;3);(4;1);(4;3);
Т.е. последние 2 точки не стоят правильно из-за того, что я не проанализировал этот этап.
Не знаю, как настроить сортировщик так, чтобы он раскидал точки по ходу отрезков. Должно же быть А-В-С-D, а он выдает A-B-D-C. Еще нужно учесть, что вершин может быть 10 или меньше, т.е. фигура меняется и как найти к ним общий подход становится реальной проблемой. Кажется, что здесь массивом легко решить задачу не удастся. Или что-то придумывать для массива или надо другой подход к решению задачи предлагать.
Примечание:
Итак,задача из учебника.
---
Даны координаты вершин многоугольника (х1,y1,x2,y2,x10,y10). Определите его периметр. Вычисление расстояние delta между вершинами оформите подпрограммой. рассмотрите использование процедур и функций.
---
Мы оба варианта подпрограмм прошли, но мне лень сейчас вправлять процедуру в функцию.
Меня в задаче ввела в заблуждение строка "(х1,y1,x2,y2,x10,y10)", я понял, что там 10 точек, а строка "координаты вершин многоугольника" не уточняет конкретное количество вершин. Вот я и взялся за n=1..10. Честно, хотелось бы свой вариант с n - угольником организовать, т.к. если я буду знать, что для задачи нужен только подход к одному случаю, то задача не будет казаться сложной, хотя сейчас она мне даже слегка кажется невыполнимой :D
Примечание:
Я думаю, может, разделить фигуру на 4 равные части(сектора), т.е. квадраты?
http://linkme.ufanet.ru/images/ded07a934d408fe37ffe7717a8c6d123.jpg
И попытаться сложить каждый сектор отдельно и потом попытаться их соединить, не забыв про соединения на краях секторов. Еще бы подумать надо, как такое реализовать и будет ли это работать вообще. Я этим, пожалуй, займусь часов через 8-9.
Примечание:
Не. Вариант с разделением слишком громоздкий. Надо что-то придумать без разделения.