平面向量

题目描述

众所周知,平面向量是指由两个实数构成的向量,例如 (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

其中 cab 的和,dab 的差,eab 的数量积。输出平面向量的格式为 (x, y),其中 xy 是平面向量的两个分量。

易错点

  • 注意运算符不应当返回引用。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;
}