Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Однамерные массивы, Помогите исправить программу


Автор: xander007 21.12.2005, 13:04
В однамерном массиве с четным количеством элементов (2N) находяться координаты N точек плоскости. Они располагаються в следующем порядке: x1, y1, x2, y2, x3, y3 и т.д.
Определить номера точек, которые могут являться вершинами равнобедренного треуголника.

(формула sqrt(sqr(x1-x2)+sqr(y1-y2)))


Код

const N = 10; 
      Eps = 0.0000001; 

function dist(x1, y1, x2, y2: real): real; 
begin 
  // попробуйте написать сами. функция должна возвращать 
  // расстояние между точками (x1,y1) и (x2,y2) 
  // по Вами же указанной формуле 
end; 

function on_the_same_line(x1,y1,x2,y2,x3,y3:real):boolean; 
begin 
  // функция возвращает true, если точки лежат на одной прямой 
  // вспомните школу 
end; 

var A: array[1..2*N] of real; 
    res: array[1..2*N*(2*N-1)*(2*N-2) div 6, 1..3] of integer; {номера подходящих троек} 
    i,j,k,m : integer; 

begin 
  writeln('Введите точки указанным образом'); 
  // здесь вы вводите точки в массив A 
  i := 1; 
  m:=1; 
  while i < 2*N-4 do begin 
    j := i + 2; 
    while j < 2*N-2 do begin 
      k := j + 2; 
      while k < 2*N do begin 
        if ((abs(dist(A[i],A[i+1],A[j],A[j+1])-dist(A[i],A[i+1],A[k],A[k+1])) < Eps) or 
            (abs(dist(A[i],A[i+1],A[j],A[j+1])-dist(A[j],A[j+1],A[k],A[k+1])) < Eps) or 
            (abs(dist(A[i],A[i+1],A[k],A[k+1])-dist(A[j],A[j+1],A[k],A[k+1])) < Eps)) and 
            (not on_the_same_line(A[i],A[i+1],A[j],A[j+1],A[k],A[k+1])) then 
        begin 
          res[m][1]:=i div 2 + 1; 
          res[m][2]:=j div 2 + 1; 
          res[m][3]:=k div 2 + 1; 
          inc(m); 
        end; 
        inc(k,2); 
      end; 
      inc (j,2); 
    end; 
    inc (i,2); 
  end; 
  for i:=1 to m-1 do writeln(res[i][1],' ',res[i][2],' ',res[i][3]); 
  readln; 
end. 


Автор: Zero 21.12.2005, 13:32
Цитата(xander007 @ 21.12.2005, 14:04)
function dist(x1, y1, x2, y2: real): real;
begin
  // попробуйте написать сами. функция должна возвращать
  // расстояние между точками (x1,y1) и (x2,y2)
  // по Вами же указанной формуле
end;

по поводу этой процедуры, тут будет типа такого:
Код

dist := sqr(x2-x1)+sqr(y2-y1)

Цитата(xander007 @ 21.12.2005, 14:04)
function on_the_same_line(x1,y1,x2,y2,x3,y3:real):boolean;
begin
  // функция возвращает true, если точки лежат на одной прямой
  // вспомните школу
end;

А тут если не вспоминать школу, т.к. такому там не учат...
По точкам (x1,y1) и (x2,y2) можно построить уравнение прямой по формуле:
(x-x1)/(x2-x1)=(y-y1)/(y2-y1) ─ отсюда выразить Y и в него подставить значение x3, и если оно будет равно y3, то точки лежат на одной прямой, иначе не лежат.

Автор: Fighter 22.12.2005, 17:42
Цитата(Zero @ 21.12.2005, 13:32)
по поводу этой процедуры, тут будет типа такого:
код Pascal/Delphi
1:

dist := sqr(x2-x1)+sqr(y2-y1)


Код

  dist := sqrt(sqr(x2-x1)+sqr(y2-y1));


Автор: Zero 22.12.2005, 20:19
а точно извиняюсь...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)