Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Датчик случайных чисел, треугольник ...

Автор: Димас 11.09.2007 20:07

Задача: С помощью датчика случайных чисел сгенерировать 2N целых чисел. Вывести номера тройки точек, которые являются координатами вершины треугольника с наибольшем углом.
~~~
В модуле сделать, операцию над векторами:
* сложения
* вычитания
* скалярного умножения векторов
* умножения вектора на число
* нахождения длинны вектора
сделать тип:
type vector = record
x,y: real;
end;
-----------------------------------------------------------

ну вот осталась всего лиш одна задачкa что бы закончить дела с tp7 smile.gif

я попытался сделать типа так:


Program ex_1375;

uses crt;

var i,j,k,n:integer;

ab,bc,ac:real;

a,b,c,aa,bb,cc:real;

maxi,maxj,maxk:integer;

max,m:real;

mas:array[1..100,1..2] of integer;

Begin
randomize;
clrscr;

write('Kollichestvo tochek (max=100) : ');
readln(n);

for i:=1 to n do
begin
mas[i,1]:=random(50)+10;
mas[i,2]:=random(50)+10;
end;

writeln;
writeln('Masiv :');
writeln;

for i:=1 to n do
begin
write(mas[i,1],' ; ');
writeln(mas[i,2]);
end;

readln;
max:=0;

for i:=1 to n-2 do
for j:=(i+1) to n-1 do
for k:=(j+1) to n do

begin
ab:=sqrt(sqr(mas[i,1]-mas[j,1])+sqr(mas[i,2]-mas[j,2]));
bc:=sqrt(sqr(mas[j,1]-mas[k,1])+sqr(mas[j,2]-mas[k,2]));
ac:=sqrt(sqr(mas[i,1]-mas[k,1])+sqr(mas[i,2]-mas[k,2]));
a:=((bc*bc+ac*ac-ab*ab)/(2*bc*ac));
b:=(ab*ab+ac*ac-bc*bc)/(2*ab*ac);
aa:=arctan(sqrt(1-a*a)/a)*180/pi;

if a<0 then aa:=aa+180;
bb:=arctan(sqrt(1-b*b)/b)*180/pi;

if b<0 then bb:=bb+180;
cc:=180-aa-bb;
m:=aa;
if bb>m then m:=bb;
if cc>m then m:=cc;
if max<m then
begin
max:=m;
maxi:=i;
maxj:=j;
maxk:=k;
end;
end;

write('Nomera tochek v masive : ');
writeln(maxi,' ; ',maxj,' ; ',maxk);
writeln;

writeln('Naibolshiy ygol v treygolnik s vershinami :');
writeln('A[',mas[maxi,1],';',mas[maxi,2],']');
writeln('B[',mas[maxj,1],';',mas[maxj,2],']');
writeln('C[',mas[maxk,1],';',mas[maxk,2],']');
writeln('Ygol raven ',max:5:2,' gradysov');

writeln;
write('Dlya vihoda nagmite knopky ...');
readln;
end.



Но я не уверен что єто правильноsad.gif и еще єто дело ж надо в модуль как то реализоавть,
но общем завал wacko.gif

Как с этим жить?

Автор: volvo 11.09.2007 20:47

Димас, ничего не находишь общего:
http://forum.pascal.net.ru/index.php?s=&showtopic=5972&view=findpost&p=45204

?

Автор: Димас 11.09.2007 21:10

Цитата(volvo @ 11.09.2007 16:47) *

Димас, ничего не находишь общего:
http://forum.pascal.net.ru/index.php?s=&showtopic=5972&view=findpost&p=45204

?


нахожу smile.gif, но разобратся видно не судьба mega_chok.gif

Автор: Димас 11.09.2007 21:38

volvo сделайте пожалуйста мне эту задачку smile.gif ... ?
а я Вам деньги заплачу , и на форум тоже перечислю wmz, за то что терпели меня неудачника norespect.gif

Просто это последняя задача которую надо сдать, что бы закрыть долги...

Автор: volvo 12.09.2007 1:53

Димас, я не понимаю, куда тут пристроить работу с векторами, но вот такой вариант имеет право на существование:

uses vector;

function max(a, b: real): real;
begin
max := a;
if b > a then max := b;
end;

function max_angle(const a, b, c: tpoint): real;

function ArcCos(x: real): real;
begin
if Abs(x) < 10E-3 then ArcCos := Pi/2
else ArcCos := ArcTan(Sqrt(1 - Sqr(x)) / x) + Pi * Byte(x < 0)
end;

function get_len(a, b, c: tpoint): real;
begin
get_len :=
ArcCos(
( sqr(VLength(b, c)) + sqr(VLength(a, c)) - sqr(VLength(a, b)) )
/
(2 * VLength(b, c) * sqr(VLength(a, c)))
);
end;

begin
max_angle :=
max(
get_len(a, b, c),
max(
get_len(b, a, c),
get_len(c, a, b)
)
);
end;

const
max_n = 20;

var
n: integer;
i, j, k,
ix_i, ix_j, ix_k: integer;
arr: array[1 .. max_n] of tpoint;
maximal, angle: real;

begin
randomize;
write('n = '); readln(n);
for i := 1 to n do
with arr[i] do begin
X := random(9) + 1; Y := random(9) + 1;
writeln('#', i:2, arr[i].X:6:2, arr[i].Y:6:2)
end;


maximal := 0;
for i := 1 to n - 2 do
for j := i + 1 to n - 1 do
for k := j + 1 to n do begin

{}
writeln(i:3, j:3, k:3);

angle := max_angle(arr[i], arr[j], arr[k]);
if angle > maximal then begin
ix_i := i; ix_j := j; ix_k := k;
maximal := angle;
end;
{}

end;

writeln('points: arr[', ix_i:3, ix_j:3, ix_k:3,
'] = ', maximal:5:2, ' rad.');
end.



где в модуле vector.pas только одна процедура:

unit vector;

interface

type
tpoint = record
X, Y: real;
end;

function VLength(a, b: tpoint): real;

implementation

function VLength(a, b: tpoint): real;
begin
VLength := Sqrt(sqr(a.X - b.X) + sqr(a.Y - b.Y));
end;

end.