Задача. на плоскости задано n прямоугольников координатами своих вершин. Найти прямоугольник с минимальной площадью. Решить задачу с помощью подпрограммы процедуры определения площади прямоугольника по координатам его вершин.
Помогите плиз как можно скорее...никак не могу додуматься как правильно сделать:(
klem4
24.02.2007 21:46
Цитата
не могу додуматься как правильно сделать
Что конкретно ? Не знаешь как по координатам вершин прямоуголника найти его площадь ? Или что ?
Yulianna
25.02.2007 3:43
Цитата(klem4 @ 24.02.2007 18:46)
Что конкретно ? Не знаешь как по координатам вершин прямоуголника найти его площадь ? Или что ?
Да. Если нахожу площадь как сумму площадей 2-х треугольников, то где-то допускаю наверное ошибку... потому что площадь просто обнуляется...
мисс_граффити
25.02.2007 3:49
1.
!
Заголовок темы должен быть информативным
переименовывай, иначе тема будет закрыта 2.
Цитата
где-то допускаю наверное ошибку...
ну наверное, если не работает... может, покажешь, что ты делаешь? тогда вероятность обнаружения ошибки несколько возрастет. 3.
Цитата
Если нахожу площадь как сумму площадей 2-х треугольников
зачем такие сложности???
Yulianna
25.02.2007 4:04
1. Не могу че-та переименовать тему:(( Вот что я сделала
program Prymougolniki; uses crt; type mas=array[1..100] of real; var i,n:integer; x1,y1,x2,y2,x3,y3,x4,y4,S: mas; a,b,d,p,S1:real; smin:real;
Procedure Plosha(x1,y1,x2,y2,x3,y3,x4,y4,S,a,b,d,p:real); var i,n:integer; begin a:=sqrt(sqr(x1-x2)+sqr(y1-y2)); b:=sqrt(sqr(x2-x3)+sqr(y2-y3)); d:=sqrt(sqr(x2-x4)+sqr(y2-y4)); p:=(a+b+d)/2; S1:=sqrt(p*(p-a)*(p-b)*(p-d)); S:=2*S1; end;
begin clrscr; writeln('Vvedite kol-vo pr-kov'); readln(n); Writeln('Vvedite koordinati pr-kov'); for i:=1 to n do begin writeln('x1[',i,']=',' y1[',i,']='); readln(x1[i],y1[i]); writeln('x2[',i,']=',' y2[',i,']='); readln(x2[i],y2[i]); writeln('x3[',i,']=',' y3[',i,']='); readln(x3[i],y3[i]); writeln('x4[',i,']=',' y4[',i,']='); readln(x4[i],y4[i]); end; Plosha(x1[i],y1[i],x2[i],y2[i],x3[i],y3[i],x4[i],y4[i],a,b,d,p,n); Smin:=S[1]; for i:=1 to n do if S[i]<Smin then begin Smin:=S[i]; end; writeln('smin',Smin); readln; end.
Procedure Plosha(x1,y1,x2,y2,x3,y3,x4,y4,a,b,d,p:real; var S: real);
.... открою тебе страшную тайну: площадь прямоугольника равна произведению длин сторон. совсем незачем извращаться с формулой Герона и вообще треугольниками. кроме того, нам совсем незачем (при данной формулировке задачи) хранить все площади. можно вычислять и сразу же сравнивать с минимальной.
Yulianna
25.02.2007 4:43
Цитата
нам совсем незачем (при данной формулировке задачи) хранить все площади. можно вычислять и сразу же сравнивать с минимальной.
Я не совсем поняла как это реализовать... не нужно площадь делать массивом?
Yulianna
25.02.2007 5:06
Я всё поняла! Спасибо большое!
klem4
25.02.2007 13:36
Для вычисления площади вполне достаточно 2-х точек, например - левой_верхней и правой_нижней
x1,y1,x2,y2,x3,y3,x4,y4,a,b,d,p:real; var S: real
как-то некомпактно выглядит
Я юы делал как-то так :
type TPoint = record x, y: Word; end;
TRect = record TL, BR: TPoint; // TopLeft, BottomRight end;
function Area(const R: TRect): Word; begin with R do Area := (BR.x - TL.x) * (TL.y - BR.y); end;
function FindMin(const R: Array of TRect): Integer; var n, i, min, T: Integer; begin n := SizeOf® div SizeOf(TRect); if n > 0 then begin min := Area(R[0]); for i := 1 to n - 1 do begin T := Area(R[i]); if T < min then min := T; end; end else min := 0; FindMin := min; end;