#include <iostream>
#include <string>

using namespace std;

class vt{
    private:
        double x;
        double y;
    public:
        vt(double a=0, double b=0){ init(a, b); }
        ~vt(){}
        void init(double a, double b){ x=a; y=b;}
        
        vt operator=(vt op2);
        friend vt operator+(vt op1, vt op2); friend vt operator+(vt op1);
        friend vt operator-(vt op1, vt op2); friend vt operator-(vt op1);
        friend vt operator*(vt op1, double op2);
        friend vt operator/(vt op1, double op2);
        friend vt operator++(vt &op1);    friend vt operator++(vt &op1, int);
        friend vt operator--(vt &op1);    friend vt operator--(vt &op1, int);
        friend bool operator==(vt op1, vt op2);
        friend bool operator!=(vt op1, vt op2);

        friend ostream &operator<<(ostream&, const vt&);
        friend istream &operator>>(istream&, vt&);
};

vt operator*(double op1, vt op2);

int main(void)
{
    vt v1(1, 1);
    vt v2, v3;

    cout << "v1=" << v1 << endl;

    cout << "Enter v2=";
    cin >> v2;

    cout << "v1+v2=" << v1+v2 << endl;
    cout << "v1-v2=" << v1-v2 << endl;
    cout << "v2*3=" << v2*3 << endl;
    cout << "3*v2=" << 3*v2 << endl;

    v3=(v1+v2)*5;
    cout << "v3=" << v3 << endl;
    cout << "v3/3=" << v3/3 << endl;
    cout << "+v3=" << +v3 << endl;
    cout << "-v3=" << -v3 << endl;
    cout << "++v3=" << ++v3 << ' ' << v3 << endl;
    cout << "v3++=" << v3++ << ' ' << v3 << endl;
    cout << "--v3=" << --v3 << ' ' << v3 << endl;
    cout << "v3--=" << v3-- << ' ' << v3 << endl;

    if(v1==v2){
        cout << "v1==v2" << endl;
    }
    else{
        cout << "v1!=v2" << endl;
    }

    return 0;
}

vt vt::operator=(vt op2){
    this->x=op2.x;
    this->y=op2.y;
    return *this;
}

vt operator+(vt op1, vt op2){
    double result_x=0, result_y=0;

    result_x = op1.x + op2.x;
    result_y = op1.y + op2.y;

    vt result(result_x, result_y);
    return result;
}
vt operator+(vt op1){
    double result_x=0, result_y=0;

    result_x = op1.x;
    result_y = op1.y;

    vt result(result_x, result_y);
    return result;
}

vt operator-(vt op1, vt op2){
    double result_x=0, result_y=0;

    result_x = op1.x - op2.x;
    result_y = op1.y - op2.y;

    vt result(result_x, result_y);
    return result;
}
vt operator-(vt op1){
    double result_x=0, result_y=0;

    result_x = -op1.x;
    result_y = -op1.y;

    vt result(result_x, result_y);
    return result;
}

vt operator*(vt op1, double op2){
    double result_x=0, result_y=0;

    result_x = op1.x * op2;
    result_y = op1.y * op2;

    vt result(result_x, result_y);
    return result;
}
vt operator*(double op1, vt op2){
    vt result=op2*op1;
    return result;
}

vt operator/(vt op1, double op2){
    double result_x=0, result_y=0;

    result_x = op1.x / op2;
    result_y = op1.y / op2;

    vt result(result_x, result_y);
    return result;
}

vt operator++(vt &op1){
    ++op1.x;
    ++op1.y;

    return op1;
}
vt operator++(vt &op1, int){
    vt temp=op1;

    ++op1.x;
    ++op1.y;

    return temp;
}

vt operator--(vt &op1){
    --op1.x;
    --op1.y;

    return op1;
}
vt operator--(vt &op1, int){
    vt temp=op1;

    --op1.x;
    --op1.y;

    return temp;
}

bool operator==(vt op1, vt op2){
    if(op1.x==op2.x && op1.y==op2.y){
        return 1;
    }
    return 0;
}

bool operator!=(vt op1, vt op2){
    if(op1.x!=op2.x || op1.y!=op2.y){
        return 1;
    }
    return 0;
}

ostream &operator<<(ostream &os, const vt &v){
    os << '(' << v.x << ", " << v.y << ')';
    return os;
}

istream &operator>>(istream &is, vt &v){
    string buf;

    is.ignore();    //skip '('
    getline(is, buf, ',');  //x성분 얻음
    v.x=stod(buf);
    getline(is, buf, ')');  //y성분 얻음
    v.y=stod(buf);

    return is;
}