Найти угол между векторами - 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
Листинг программы
  1. const m = 100;
  2.  
  3. type vec = array [1..m] of double;
  4.  
  5. procedure read_v(s: string; var x: vec; k: integer);
  6. var i: integer;
  7. begin
  8.   writeln('Введите координаты вектора ', s);
  9.   for i := 1 to k do
  10.     begin
  11.       write(s, '[', i, '] = ');
  12.       readln(x[i])
  13.     end
  14. end;
  15.  
  16. procedure prn_v(s: string; var x: vec; k: integer);
  17. var i: integer;
  18. begin
  19.   writeln('Вектор ', s);
  20.   for i := 1 to k do write(' ', x[i]:19);
  21.   writeln
  22. end;
  23.  
  24. function p(var x, y: vec; k, mode: integer): double;
  25. var i: integer;
  26.     z: double;
  27. begin
  28.   z := 0;
  29.   for i := 1 to k do z := z + x[i] * y[i];
  30.   if mode = 1 then z := sqrt(z);
  31.   p := z
  32. end;
  33.  
  34. function arccos(a: double): double;
  35. begin
  36.   if a = -1
  37.     then arccos := pi
  38.     else if a = 0
  39.       then arccos := pi / 2
  40.       else if a = 1
  41.         then arccos := 0
  42.         else arccos := arctan(sqrt(1 - a * a) / a)
  43. end;
  44.  
  45. var n: integer;
  46.     a, b: vec;
  47.  
  48. begin
  49.   repeat
  50.     write('Введтите размерность пространства ( не менее 1 ): ');
  51.     readln(n)
  52.   until n > 1;
  53.   read_v('A', a, n);
  54.   read_v('B', b, n);
  55.   writeln('Исходные векторы:');
  56.   prn_v('A', a, n);
  57.   prn_v('B', b, n);
  58.   writeln;
  59.   write('Угол между векторами: ',
  60.          arccos(p(a, b, n, 0) / p(a, a, n, 1) / p(b, b, n, 1)):0:11,
  61.          ' радиан.');
  62.   readln
  63. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы