Найти угол между векторами - 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.
- Завершается программа.