Найти угол между векторами - 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.
Объяснение кода листинга программы
- Создается константа m, которая равна 100.
- Создается тип данных vec, который представляет собой массив из double-чисел.
- Создается процедура read_v, которая принимает строку, массив x и число k в качестве параметров. Внутри процедуры выводится сообщение для запроса координат вектора, а затем для каждого индекса i от 1 до k происходит чтение координаты из x[i] и запись ее в соответствующую ячейку массива.
- Создается процедура prn_v, которая принимает строку, массив x и число k в качестве параметров. Внутри процедуры выводится сообщение для вывода вектора, а затем для каждого индекса i от 1 до k происходит вывод соответствующего элемента массива.
- Создается функция p, которая принимает массивы x и y, число k и режим в качестве параметров. Внутри функции вычисляется сумма z для каждого индекса i от 1 до k, где z - это сумма произведений соответствующих элементов x[i] и y[i]. Если режим равен 1, то вычисляется квадратный корень z. Функция возвращает значение z.
- Создается функция arccos, которая принимает одно из значений acos(x), где x - это косинус угла в радианах. В зависимости от значения x функция возвращает pi, pi/2, 0 или arctan(sqrt(1 - x^2) / x).
- Создается переменная n, которая инициализируется значением 1.
- Выполняется цикл repeat, в котором пользователю предлагается ввести размерность пространства. Цикл продолжается до тех пор, пока введенное значение больше 1.
- Внутри цикла вызывается процедура read_v для ввода векторов A и B.
- Выводится сообщение с исходными векторами.
- Вызывается функция p для вычисления угла между векторами A и B.
- Выводится сообщение с результатом вычисления угла.
- Вызывается функция arccos для вычисления арккосинуса угла между векторами A и B.
- Завершается программа.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д