Помощь - Поиск - Пользователи - Календарь
Полная версия: Датчик случайных чисел, треугольник ...
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Димас
Задача: С помощью датчика случайных чисел сгенерировать 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
Димас, ничего не находишь общего:
Операции над векторами

?
Димас
Цитата(volvo @ 11.09.2007 16:47) *

Димас, ничего не находишь общего:
Операции над векторами

?


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

Просто это последняя задача которую надо сдать, что бы закрыть долги...
volvo
Димас, я не понимаю, куда тут пристроить работу с векторами, но вот такой вариант имеет право на существование:

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.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.