Другие языки программирования и технологии

Разработать класс описывающий множество точек на плоскости, реализовать метод который возвращает наименьшее расстояние

Разработать класс описывающий множество точек на плоскости, реализовать метод который возвращает наименьшее расстояние между 2-мя точками этого множества.
Пример программы, в которой реализован класс TMyClass с двумя методами:
Init(n) - формирование множества n точек со случайными координатами и вывод их на экран для контроля;
MinDistance() - поиск наименьшего расстояния между двумя из n точек, хранящихся в поле-массиве Point.

<*+ MAIN *>
MODULE N69898565;
IMPORT io := InOut, Random, TimeConv, RealMath, SRealIO, STextIO;
CONST n = 15;
TYPE
TPoint = RECORD
x, y: REAL
END;

TMyClass = RECORD
Size:INTEGER;
Point:POINTER TO ARRAY OF TPoint
END;

VAR Class:POINTER TO TMyClass;
c:CHAR;

PROCEDURE sqr(x:REAL):REAL;
BEGIN
RETURN x * x;
END sqr;

PROCEDURE (VAR t:TMyClass) Init(N:INTEGER);
VAR i:INTEGER;
BEGIN
t.Size := N;
NEW(t.Point, t.Size);
FOR i := 0 TO t.Size - 1 DO
t.Point^[ i ].x := Random.Uniform() * 200 - 100;
t.Point^[ i ].y := Random.Uniform() * 200 - 100;
SRealIO.WriteFixed(t.Point^[ i ].x,4,10);
io.WriteString(",");
SRealIO.WriteFixed(t.Point^[ i ].y,4,10);
io.WriteLn()
END
END Init;

PROCEDURE (VAR t:TMyClass) MinDistance():REAL;
VAR i, j:INTEGER;
min, Distance:REAL;
BEGIN
FOR i := 0 TO t.Size - 1 DO
FOR j := 0 TO t.Size - 1 DO
IF i # j THEN
Distance:=sqr(t.Point^[ i].x-t.Point^[j].x)+sqr(t.Point^[ i].y-t.Point^[j].y);
IF (i + j = 1) & (i = 0) OR (Distance < min) THEN
min := Distance
END
END
END
END;
RETURN RealMath.sqrt(min)
END MinDistance;

BEGIN
Random.InitSeed(TimeConv.millisecs());
NEW(Class);
io.WriteString("Множество точек: ");
io.WriteLn;
Class^.Init(n);
io.WriteString("Наименьшее расстояние между двумя точками: ");
SRealIO.WriteFixed(Class^.MinDistance(), 4, 1);
STextIO.ReadChar(c);
END N69898565.
Adlet )))))))
Adlet )))))))
51 590
Лучший ответ
Вложенный цикл, проходишь по всевозможным парам элементов
double min:=10000,d;
for (i:=0;i < m.Length-1;i++) for(j:=i+1;j < m.length;j++)
if ((d=Math.sqrt((m[j].x-m[ i].x)*(m[j].x-m.x)+(m[j].y-m[ i].y)*(m[j].y-m[ i].y)) < d) min:=d;
Вообщем формула расстояния между точками: корень ((x2-x1)^2+(y2-y1)^2)
El Greko
El Greko
15 838

Похожие вопросы