Задача: С помощью датчика случайных чисел сгенерировать 2N целых чисел. Вывести номера тройки точек, которые являются координатами вершины треугольника с наибольшем углом.
~~~
В модуле сделать, операцию над векторами:
* сложения
* вычитания
* скалярного умножения векторов
* умножения вектора на число
* нахождения длинны вектора
сделать тип:
type vector = record
x,y: real;
end;
-----------------------------------------------------------
ну вот осталась всего лиш одна задачкa что бы закончить дела с tp7
я попытался сделать типа так:
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.
Димас, ничего не находишь общего:
http://forum.pascal.net.ru/index.php?s=&showtopic=5972&view=findpost&p=45204
?
volvo сделайте пожалуйста мне эту задачку ... ?
а я Вам деньги заплачу , и на форум тоже перечислю wmz, за то что терпели меня неудачника
Просто это последняя задача которую надо сдать, что бы закрыть долги...
Димас, я не понимаю, куда тут пристроить работу с векторами, но вот такой вариант имеет право на существование:
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.
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.