Даны два
вектора. Найдите их скалярное произведение и угол между ними.
Напишите код
согласно следующего интерфейса:
class
Vector // C++
{
public:
int dx, dy;
Vector(void); // Конструктор.
Прочитайте координаты вектора
double Len(void); // Возвращает длину
вектора
int operator *(Vector &b); // Перегрузка оператора *:
// возвращает
скалярное произведение векторов
double
GetAngle(Vector &b); // Возвращает в радианах
угол между
// текущим вектором
и вектором b
};
class Vector // Java
{
private int dx, dy;
Vector(); // Конструктор. Создает
нулевой вектор
Vector(int dx, int dy); //
Конструктор. Создает вектор (dx, dy)
public double getLength(); // Возвращает
длину вектора
public int Scalar(Vector v); // Скалярное
произведение векторов
public double GetAngle(Vector
v); // Угол
между векторами
};
Вход. Четыре целых числа – координаты ненулевых
векторов. Все числа по модулю не превосходят 10000.
Выход. В первой
строке выведите скалярное произведение двух векторов, а во второй выведите
величину неориентированного угла между векторами с точностью до пяти десятичных
знаков. Выводимое число должно принадлежать интервалу [0; π].
Пример входа |
Пример выхода |
2 1 3
5 |
11 0.56673 |
ООП – перегрузка
операторов
Анализ алгоритма
Объявим класс Vector и реализуем
требуемые методы.
Реализация алгоритма
#include <stdio.h>
#include <math.h>
class
Vector
{
public:
int dx, dy;
Vector(void)
{
scanf("%d
%d",&dx,&dy);
}
double Len(void)
{
return
sqrt(1.0*dx*dx + dy*dy);
}
int operator *(Vector &b)
{
return dx *
b.dx + dy * b.dy;
}
double
GetAngle(Vector &b)
{
return
acos((double)(*this
* b) / this->Len() / b.Len());
}
};
int
main(void)
{
Vector a, b;
printf("%d\n",a
* b);
printf("%.5lf\n",a.GetAngle(b));
return 0;
}
Реализация алгоритма – описание
интерфейса + отдельная реализация методов
#include <stdio.h>
#include <math.h>
class
Vector {
public:
int dx;
int dy;
Vector();
double Len();
int operator*(Vector &b);
double
GetAngle(Vector &b);
};
Vector::Vector()
{
scanf("%d
%d",&dx,&dy);
}
double Vector::Len() {
return
sqrt(1.0*dx*dx + dy*dy);
}
int
Vector::operator*(Vector &b) {
return dx *
b.dx + dy * b.dy;
}
double Vector::GetAngle(Vector &b) {
return acos((double)(*this * b) / this->Len() / b.Len());
}
int
main(void)
{
Vector a, b;
printf("%d\n",a
* b);
printf("%.5lf\n",a.GetAngle(b));
return 0;
}
Java реализация
import java.util.*;
class Vector
{
private int dx, dy;
Vector()
{
dx = dy = 0;
}
Vector(int dx, int dy)
{
this.dx = dx;
this.dy = dy;
}
public double getLength()
{
return Math.sqrt(dx * dx + dy * dy);
}
public int Scalar(Vector v)
{
return v.dx * dx + v.dy * dy;
}
public double GetAngle(Vector
v)
{
int s = this.Scalar(v);
return Math.acos(s / this.getLength() / v.getLength());
}
};
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
int a = con.nextInt();
int b = con.nextInt();
Vector u = new Vector(a,b);
a = con.nextInt();
b = con.nextInt();
Vector v = new Vector(a,b);
System.out.println(u.Scalar(v));
System.out.println(u.GetAngle(v));
con.close();
}
}