平面向量
题目描述
众所周知,平面向量是指由两个实数构成的向量,例如 (1, 2)、(-3, 5) 等等。
平面向量之间可以做加减法,(x1, y1) ± (x2, y2) = (x1 ± x2, y1 ± y2)。
平面向量可以做点乘(数量积)得到实数,(x1, y1) · (x2, y2) = x1x2 + y1y2。
请给出指代平面向量的 Vector
类的定义,它支持 +
、-
和 *
运算符,分别指代上述加法、减法和点乘。Vector
类对象也支持通过 std::cout
输出。本题只用考虑整数坐标情形。
关于输入
共两行。
第一行为两个空格分隔的整数 x1、y1;
第二行为两个空格分隔的整数 x2 和 y2。
所有输入的值在 ±105 范围内;记 a 为平面向量 (x1, y1),记 b 为平面向量 (x2, y2)。
关于输出
共三行,分别具有形式:
a + b = c
a - b = d
a * b = e
其中 c 是 a、b 的和,d 是 a、b 的差,e 是 a、b 的数量积。输出平面向量的格式为 (x, y)
,其中 x
和 y
是平面向量的两个分量。
易错点
- 注意运算符不应当返回引用。
a + b
应当是右值,它不是谁的别名。 - 注意
operator<<
的右侧操作数类型为const T&
,这样才可以同时接受左右值的输出。
参考答案
#include <iostream>
class Vector {
int x;
int y;
public:
Vector(int x, int y) : x{x}, y{y} {}
friend Vector operator+(const Vector& lhs, const Vector& rhs) {
return Vector(lhs.x + rhs.x, lhs.y + rhs.y);
}
friend Vector operator-(const Vector& lhs, const Vector& rhs) {
return Vector(lhs.x - rhs.x, lhs.y - rhs.y);
}
friend int operator*(const Vector& lhs, const Vector& rhs) {
return lhs.x * rhs.x + lhs.y * rhs.y;
}
friend std::ostream& operator<<(std::ostream& os, const Vector& v) {
return os << '(' << v.x << ", " << v.y << ')';
}
};
int main() {
int x1, y1, x2, y2;
std::cin >> x1 >> y1 >> x2 >> y2;
Vector v1(x1, y1);
Vector v2(x2, y2);
std::cout << v1 << " + " << v2 << " = " << v1 + v2 << std::endl;
std::cout << v1 << " - " << v2 << " = " << v1 - v2 << std::endl;
std::cout << v1 << " * " << v2 << " = " << v1 * v2 << std::endl;
}