Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
25 / 25 / 24
Регистрация: 11.04.2010
Сообщений: 87

Выберите четыре разные точки, которые являются вершинами квадрата наибольшего периметра

19.10.2010, 08:04. Показов 5709. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание: Задано множество точек на плоскости. Выберите из них четыре разные точки, которые являются вершинами квадрата наибольшего периметра.

Есть вот такая программка, но работает не всегда правильно для различных тестов.
Посмотрите пожалуйста где ошибка. Или если у вас есть альтернативное решение выложите плз.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
var
   a:array [1..1000] of integer;
   i,j,k,l,n,mi,mj,mk,ml:integer;
   d1,d2,d3,d4,p,mp:real;
{по х}
function
   x(i:integer):real;
begin
   x:=a[2*i-1];
end;
{по y}
function
   y(i:integer):real;
begin
   y:=a[2*i]
end;
{длина отрезка(используем 2 выше описанные функции)}
function
   dl(i,j:integer):real;
begin
   dl:=sqrt(sqr(x(i)-x(j))+sqr(y(i)-y(j)))
end;
{begin}
begin
   writeln('Количество точек: ');
   readln(n);
   for i:=1 to n do
   begin
      write('x[',i,']=');
      readln(a[2*i-1]);
      write('y[',i,']=');
      readln(a[2*i]);
   end;
   for i:=1 to n-3 do
      for j:=i+1 to n-2 do
         for l:=j+1 to n-1 do
            for k:=l+1 to n do
            begin
               d1:=dl(j,i);;
               d2:=dl(l,j);
               d3:=dl(k,l);
               d4:=dl(k,i);
               if (d1=d2) and (d2=d3) and (d3=d4) and (d4=d1) then
                  if (d1<>0) then
                  begin
                  p:=d1+d2+d3+d4;
                  if p>mp then
                     begin
                        mi:=i;
                        mj:=j;
                     mk:=k;
                        ml:=l;
                  mp:=p;
                  end;
                  end;
            end;
   if p<>0 then
   begin
      writeln('Квадрат с максимальным периметром: ');
      writeln('Точки :',mi,':',mj,':',ml,':',mk);
      writeln('Периметр: ',mp:4:2);
   end
   else
      writeln('НЕТУ КВАДРАТА!');
   ReadLn;
 end.
Добавлено через 8 часов 39 минут
Например для этого теста выдает неправильный результат
-1 0
1 0
0 1
0 -1
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.10.2010, 08:04
Ответы с готовыми решениями:

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

Выбрать из точек четыре разные, которые являются вершинами квадрата наибольшего периметра
Задано множество точек на плоскости. Выбрать из низ четыре разные точки, которые являются вершинами квадрата наибольшего периметра. (Т.А)

Выбрать из точек 4 разные, которые являют вершинами квадрата наибольшего периметра
Помогите написать программу. Задано кол-во точек на плоскости. Выбрать из них 4 разные, которые являют вершинами квадрата наибольшего...

7
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
19.10.2010, 09:22
Цитата Сообщение от Dtsnoob Посмотреть сообщение
if (d1=d2) and (d2=d3) and (d3=d4) and (d4=d1) then
Это недостаточная проверка на квадрат, это может быть и ромб. Нужно еще проверить либо равенство диагоналей, либо наличие прямого угла.
1
25 / 25 / 24
Регистрация: 11.04.2010
Сообщений: 87
19.10.2010, 13:46  [ТС]
Помимо этой кажется еще есть ошибка проверки условия. Потому что по идее если длина 4 сторон одинакова по условию должны выводиться координаты точек. Программа лишь выдает верный ответ тогда когда точки вводятся последовательно.
Например для точек (0,0) (1,0) (1,1) (0,1) выводится правильный ответ
А для тех же точек только введенных в другой последовательности (0,0) (1,1) (1,0) (0,1) выдает неверный результат.
Цитата Сообщение от Puporev Посмотреть сообщение
Нужно еще проверить либо равенство диагоналей
Скажите пожалуйста как это осуществить?
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
19.10.2010, 13:57
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Я как-то делал такое.
1. Определить 6 длин линий и собрать их в массив
1-2 1-3 1-4 2-3 2-4 3-4
2. Отсортировать массив по возрастанию.
3.Если равны первые 4 длины, и 5=6, то квадрат.

Добавлено через 1 минуту
Вот код. Посмотрите, может есть неточности, давно писал.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
uses crt;
const t=0.000001;
function Dlina(x1,y1,x2,y2:real):real;
begin
Dlina:=sqrt(sqr(x1-x2)+sqr(y1-y2));
end;
var p:array[1..2,1..4] of real;
    d:array[1..6] of real;
    i,j,k:byte;
    x:real;
begin
clrscr;
writeln('Vvedite koordinaty 1 tochki:');
readln(p[1,1],p[2,1]);
writeln('Vvedite koordinaty 2 tochki:');
readln(p[1,2],p[2,2]);
writeln('Vvedite koordinaty 3 tochki:');
readln(p[1,3],p[2,3]);
writeln('Vvedite koordinaty 4 tochki:');
readln(p[1,4],p[2,4]);
k:=0;
for i:=1 to 3 do
for j:=i+1 to 4 do
 begin
  k:=k+1;
  d[k]:=Dlina(p[1,i],p[2,i],p[1,j],p[2,j]);
 end;
for i:=1 to 5 do
for j:=i+1 to 6 do
if d[i]>d[j] then
 begin
  x:=d[i];
  d[i]:=d[j];
  d[j]:=x;
 end;
{длины сторн и диагоналей}
for i:=1 to 6 do
write(d[i]:5:2);
writeln;
if (abs(d[1]-d[2])<t)and(abs(d[2]-d[3])<t)and(abs(d[3]-d[4])<t)
and(abs(d[5]-d[6])<t)
then write('Yes!') else write('No!');
readln
end.
1
25 / 25 / 24
Регистрация: 11.04.2010
Сообщений: 87
19.10.2010, 17:22  [ТС]
Окончательно запутался, пробывал сравнивать длины диагоналей, все равно не получается. Не могу понять где ошибка

Добавлено через 1 час 20 минут
Помогите правильное условие составить. Мое условие в зависимости от ввода сравнивает одну сторону с другой стороной (если вводить точки последовательно:по часовой стрелке или против часовой) или одну сторону с диагональю (если вводить в разброс). Мне нужно какое нибудь универсальное условие для установления квадрата
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
19.10.2010, 17:43
Я вам и написал универсальное. Вы хоть чуть вникните в суть.
0
25 / 25 / 24
Регистрация: 11.04.2010
Сообщений: 87
19.10.2010, 22:35  [ТС]
Puporev,
Вникнул в суть программы. Пробовал переделать ее для n-количества точек. Не получилось(((
Возникают проблемы для проверки условия совпадения длин сторон.
Pascal
1
2
if (abs(d[1]-d[2])<t)and(abs(d[2]-d[3])<t)and(abs(d[3]-d[4])<t)
and(abs(d[5]-d[6])<t)
Весь день потратил на решение данной задачи и все впустую. Не получается решить

Добавлено через 1 минуту
У кого есть готовый код пожалуйста выложите, уже хочется посмотреть что из себя представляет данная программа, уже сил нет(((
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
20.10.2010, 07:36
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Пару раз на 8 точках потестировал.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
uses crt;
const p=0.0001;{точность сравнения длин}
      nmax=16;{больше все равно вводить не будешь}
type Point=record {тип - точка}
           x,y:real;
           end;
function Dlina(a,b:Point):real;
begin
Dlina:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
end;
var t:array[1..nmax] of Point;{массив точек}
    d:array[1..6] of real;{массив длин сторон и диагоналей}
    n,i,j,k,l,ii,jj,imx,jmx,kmx,lmx:byte;
    x,pr,mx:real;
begin
clrscr;
repeat
writeln('Количество точек от 4 до ',nmax,' n=');;
readln(n);
until n in [4..nmax];
writeln('Введите координаты точек:');
for i:=1 to n do
  begin
   writeln('Точка ',i);
   write('x=');readln(t[i].x);
   write('y=');readln(t[i].y);
  end;
clrscr;
writeln('Координаты:');
write('№');
for i:=1 to n do
write(i:4);
writeln;
write('X:');
for i:=1 to n do
write(t[i].x:4:1);
writeln;
write('Y:');
for i:=1 to n do
write(t[i].y:4:1);
writeln;
writeln;
imx:=0;mx:=0;
for i:=1 to n-3 do
for j:=i+1 to n-2 do
for k:=j+1 to n-1 do
for l:=k+1 to n do
 begin {длины сторон и диагоналей в массив}
  d[1]:=Dlina(t[i],t[j]);
  d[2]:=Dlina(t[i],t[k]);
  d[3]:=Dlina(t[i],t[l]);
  d[4]:=Dlina(t[j],t[k]);
  d[5]:=Dlina(t[j],t[l]);
  d[6]:=Dlina(t[k],t[l]);
  for ii:=1 to 5 do {сортируем по возрастанию}
  for jj:=ii+1 to 6 do
  if d[ii]>d[jj] then
   begin
    x:=d[ii];
    d[ii]:=d[jj];
    d[jj]:=x;
   end; {если первые 4 равны и последние 2 равны и они больше первых}
  if (abs(d[1]-d[2])<p)and(abs(d[2]-d[3])<p)and(abs(d[3]-d[4])<p)
  and(abs(d[5]-d[6])<p)and(d[5]>d[1]) then
    begin
     pr:=4*d[1];{периметр}
     if pr>mx then
      begin
       mx:=pr;{макс. периметр}
       imx:=i;{номера веpшин}
       jmx:=j;
       kmx:=k;
       lmx:=l;
      end;
    end;
 end;
if imx=0 then write('Квадратов нет!')
else
 begin
  writeln('Квадрат с максимальным периметром образуют точки:');
  writeln(imx,'- x=',t[imx].x:0:1,' y=',t[imx].y:0:1);
  writeln(jmx,'- x=',t[jmx].x:0:1,' y=',t[jmx].y:0:1);
  writeln(kmx,'- x=',t[kmx].x:0:1,' y=',t[kmx].y:0:1);
  writeln(lmx,'- x=',t[lmx].x:0:1,' y=',t[lmx].y:0:1);
 end;
readln
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.10.2010, 07:36
Помогаю со студенческими работами здесь

Массив: Выяснить, найдутся ли среди точек с координатами х1...х15, у1...у15 четыре таких, которые являются вершинами квадрата.
Выяснить, найдутся ли среди точек с координатами х1...х15, у1...у15 четыре таких, которые являются вершинами квадрата.

В заданном множестве точек на плоскости найдите четыре точки, которые могут служить вершинами квадрата
1)В заданном множестве точек на плоскости найдите четыре точки, которые могут служить вершинами квадрата.

Выбрать четыре точки, которые являются вершинами квадрата наибольшего периметра
Задано множество точек на плоскости. Выбрать из них четыре разных точки, которые являются вершинами квадрата наибольшего периметра. Кто...

Выбрать из заданных точек четыре различные точки, которые являются вершинами квадрата наибольшего периметра
Используя библиотеку glut-3.7.6,написать программу,решающую задачу: На плоскости задано множество точек. Выбрать из них четыре...

Четыре точки являются вершинами четырехугольника, могут ли они быть вершинами квадрата?
четыре точки являются вершинами четырехугольника A (x1, y1), B (x2, y2), C (x3, y3), D (x4, y4) . Выяснить, могут ли они быть вершинами...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru