#include <iostream>
// aby można było użyć cin i cout

using namespace std;
// aby pomijać std::

class LZesp {

protected:
    double re;
    double im;

public:
    LZesp(double are=0, double aim=0)
    {
        re = are; im = aim;
    }

    LZesp(const LZesp &z)
    {
        re = z.getRe();
        im = z.getIm();
    }

    double getRe() const
    {
        return re;
    }

    double getIm() const
    {
        return im;
    }

    void set(double are, double aim)
    {
        re = are; im = aim;
    }

    LZesp operator+(const LZesp &l) const
    {
        return LZesp(re + l.getRe(), im + l.getIm());       
    }

    LZesp& operator=(const LZesp &l)
    {
        if (&l != this) {
            re = l.getRe();
            im = l.getIm();
        }
        return *this;
    }
};

ostream& operator<<(ostream &o, const LZesp &l)
{
    o << l.getRe() << " + " << l.getIm() << "i";
    return o;
}

int main(void)
{
    LZesp l1(2,3), l2(3,4), l3;
    l3 = l1 + l2;
    // tak naprawdę:
    // l3.operator=( l1.operator+(l2) );
    
    cout << l1 << " + " << l2 << " = " << l3 << endl;

    // kod poniżej można odkomentować dopiero po implementacji
    // odpowiednich operatorów

    //LZesp l4, l5;
    //cin >> l4;
    //cin >> l5;
    //cout << l4 << " * " << l5 << " = " << l4*l5 << endl;
    //cout << l4 << " - " << l5 << " = " << l4-l5 << endl;
    //if (l4 == l5) cout << l4 << " jest rowna " << l5 << endl;
    //else cout << l4 << " nie jest rowna " << l5 << endl;
    //if (l4 != l5) cout << l4 << " rozni sie od " << l5 << endl;
    //else cout << l4 << " nie rozni sie od " << l5 << endl;

    return 0;
}

