Страница 1 из 1

помогите с задачей

Добавлено: 19 окт 2009, 15:32
killers
нужно вывести на экран треугольник с максимальным периметром.все это на паскале с использованием собственного модуля. наработки есть но не работают циклы когда я начинаю перебирать координаты точек, почему не знаю. пожалуйста пишите по san-910@mail.ru или в аську 448726925 я ни че в этом не шарю

Re: помогите с задачей

Добавлено: 20 окт 2009, 07:31
atavin-ta
Дай свой исходник. Посмотрю, что можно сделать.

Re: помогите с задачей

Добавлено: 20 окт 2009, 12:25
killers
нужно именно на паскале

Re: помогите с задачей

Добавлено: 20 окт 2009, 12:32
atavin-ta
На чём тебе нужно я и так прочитал. Давай исходник. Если надо на паскале, на нём и попробую сделать. И не понимай мою подпись слишком буквально.

Re: помогите с задачей

Добавлено: 20 окт 2009, 17:40
killers
[syntax="pascal"]
function dlina (x1,x2,y1,y2:integer):real;
var s:real;
begin
if (x1<>x2) or (y1<>y2) then s:=sqrt(sqr(x1-x2)+sqr(y1-y2));
dlina:=s;
end;
function perimetr (x1,x2,x3,y1,y2,y3:integer):real;
var p:real;
begin
if ((x1<>x2) and (x1<>x3)) and ((y1<>y2) and (y1<>y3)) then
p:=dlina(x1,x2,y1,y2)+dlina(x1,x3,y1,y3)+dlina(x2,x3,y2,y3);
perimetr:=p;
end;
procedure proverka (perimetr:real);
var Pmax:real;
Xmax1,Xmax2,Xmax3,Ymax1,Ymax2,Ymax3:integer;
begin
Pmax:=0;
if perimetr>Pmax them begin
Pmax:=perimetr;
Ymax1:=y1;
Ymax2:=y2;
Ymax3:=y3;
Xmax1:=x1;
Xmax2:=x2;
Xmax3:=x3;
end;
begin
как сделать так что бы x1,x2,x3,y1,y2,y3 начали присваиваться координаты каждой координаты пикселя в паскале :confused: :confused:
proverka;
end;
[/syntax]

Re: помогите с задачей

Добавлено: 20 окт 2009, 17:59
killers
и с графикой не разберусь че делать, как потом вывести его на экран монитора :confused: :confused: :confused: :confused:

Re: помогите с задачей

Добавлено: 21 окт 2009, 10:58
atavin-ta

Код: Выделить всё

function dlina (x1,x2,y1,y2:integer):real;
begin 
       dlina:=sqrt(sqr(x1-x2)+sqr(y1-y2));
end;
function perimetr (x1,x2,x3,y1,y2,y3:integer):real;
begin
       perimetr:=dlina(x1,x2,y1,y2)+dlina(x1,x3,y1,y3)+dlina(x2, x3,y2,y3);
end;
procedure proverka (perimetr:real);
var Pmax:real;
     Xmax1,Xmax2,Xmax3,Ymax1,Ymax2,Ymax3:integer;
begin
      Pmax:=0;
      if perimetr>Pmax them begin
                                             Pmax:=perimetr;
                                             Ymax1:=y1;
                                             Ymax2:=y2;
                                             Ymax3:=y3;
                                             Xmax1:=x1;
                                             Xmax2:=x2;
                                             Xmax3:=x3;
                            end;
begin
       for x1:=0 to 639 do
           for x2:=0 to 639 do
                for x3:=0 to 639 do
                     for y1:=0 to 479 do
                          for y2:=0 to 479 do
                              for y3:=0 to 479 do
                                   proverka(perimetr(x1,x2,x3,y1,y2,y3)) ;
end;
Это не совсем то, что тебе надо, но циклы должны работать. Прога переберёт много вырожденных треугольников, в том числе, с нулевым периметром, но ни один из них не может иметь максимльного периметра, поэтому будут выбраны вершины невырожденного треугольника, в котором ни одна вершина не совпадает с другой. В функциях dlina и perimetr ошибочны альтерантивы: если условие не выполняется, то что будет возвращено? А должне возращаться ноль. По графике есть конкретные вопросы? И в следующий раз подсвечивай синтаксис тегами

Код: Выделить всё

, [/ code] без пробелов и форматируй код пробелами.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
[code]
uses Crt, Graph;
var
grMode, grDriver: Integer;
x1,x2,x3,y1,y2,y3:integer;
Pmax:real;
Xmax1,Xmax2,Xmax3,Ymax1,Ymax2,Ymax3:integer;
function dlina (x1,x2,y1,y2:integer):real;
begin 
       dlina:=sqrt(sqr(x1-x2)+sqr(y1-y2));
end;
function perimetr (x1,x2,x3,y1,y2,y3:integer):real;
begin
       perimetr:=dlina(x1,x2,y1,y2)+dlina(x1,x3,y1,y3)+dlina(x2, x3,y2,y3);
end;
procedure proverka (perimetr:real);
begin
      Pmax:=0;
      if perimetr>Pmax them begin
                                             Pmax:=perimetr;
                                             Ymax1:=y1;
                                             Ymax2:=y2;
                                             Ymax3:=y3;
                                             Xmax1:=x1;
                                             Xmax2:=x2;
                                             Xmax3:=x3;
                            end;
begin
       grDriver:=0;
       grMode:=0;
       InitGraph(grDriver, grMode, '');
       ang := 1; m := 100;
       for x1:=0 to 639 do
           for x2:=0 to 639 do
                for x3:=0 to 639 do
                     for y1:=0 to 479 do
                          for y2:=0 to 479 do
                              for y3:=0 to 479 do
                                   proverka(perimetr(x1,x2,x3,y1,y2,y3)) ;
       MoveTo(x1,y1);
       LineTo(x2,y2);
       LineTo(x3,y3);
       LineTo(x1,y1);
       repeat until KeyPressed;
       CloseGraph;
end.