Найти угол между векторами - Pascal (80994)

Узнай цену своей работы

Формулировка задачи:

Даны координаты двух n-мерных векторов. A(a[1]; a[2]; ...; a[n]), B(b[1]; b[2]; ...; b[n]). Найти угол между векторами: cos(A ^ B)=(A * B)/( |A| * |B| ).

Решение задачи: «Найти угол между векторами»

textual
Листинг программы
const m = 100;
 
type vec = array [1..m] of double;
 
procedure read_v(s: string; var x: vec; k: integer);
var i: integer;
begin
  writeln('Введите координаты вектора ', s);
  for i := 1 to k do
    begin
      write(s, '[', i, '] = ');
      readln(x[i])
    end
end;
 
procedure prn_v(s: string; var x: vec; k: integer);
var i: integer;
begin
  writeln('Вектор ', s);
  for i := 1 to k do write(' ', x[i]:19);
  writeln
end;
 
function p(var x, y: vec; k, mode: integer): double;
var i: integer;
    z: double;
begin
  z := 0;
  for i := 1 to k do z := z + x[i] * y[i];
  if mode = 1 then z := sqrt(z);
  p := z
end;
 
function arccos(a: double): double;
begin
  if a = -1
    then arccos := pi
    else if a = 0
      then arccos := pi / 2
      else if a = 1
        then arccos := 0
        else arccos := arctan(sqrt(1 - a * a) / a)
end;
 
var n: integer;
    a, b: vec;
 
begin
  repeat
    write('Введтите размерность пространства ( не менее 1 ): ');
    readln(n)
  until n > 1;
  read_v('A', a, n);
  read_v('B', b, n);
  writeln('Исходные векторы:');
  prn_v('A', a, n);
  prn_v('B', b, n);
  writeln;
  write('Угол между векторами: ',
         arccos(p(a, b, n, 0) / p(a, a, n, 1) / p(b, b, n, 1)):0:11,
         ' радиан.');
  readln
end.

Объяснение кода листинга программы

  1. Создается константа m, которая равна 100.
  2. Создается тип данных vec, который представляет собой массив из double-чисел.
  3. Создается процедура read_v, которая принимает строку, массив x и число k в качестве параметров. Внутри процедуры выводится сообщение для запроса координат вектора, а затем для каждого индекса i от 1 до k происходит чтение координаты из x[i] и запись ее в соответствующую ячейку массива.
  4. Создается процедура prn_v, которая принимает строку, массив x и число k в качестве параметров. Внутри процедуры выводится сообщение для вывода вектора, а затем для каждого индекса i от 1 до k происходит вывод соответствующего элемента массива.
  5. Создается функция p, которая принимает массивы x и y, число k и режим в качестве параметров. Внутри функции вычисляется сумма z для каждого индекса i от 1 до k, где z - это сумма произведений соответствующих элементов x[i] и y[i]. Если режим равен 1, то вычисляется квадратный корень z. Функция возвращает значение z.
  6. Создается функция arccos, которая принимает одно из значений acos(x), где x - это косинус угла в радианах. В зависимости от значения x функция возвращает pi, pi/2, 0 или arctan(sqrt(1 - x^2) / x).
  7. Создается переменная n, которая инициализируется значением 1.
  8. Выполняется цикл repeat, в котором пользователю предлагается ввести размерность пространства. Цикл продолжается до тех пор, пока введенное значение больше 1.
  9. Внутри цикла вызывается процедура read_v для ввода векторов A и B.
  10. Выводится сообщение с исходными векторами.
  11. Вызывается функция p для вычисления угла между векторами A и B.
  12. Выводится сообщение с результатом вычисления угла.
  13. Вызывается функция arccos для вычисления арккосинуса угла между векторами A и B.
  14. Завершается программа.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы