Перейти к содержимому

ОП ЛБ 2

Простое задание

class Complex_num
{
private:
	double re;
	double im;
public:
	Complex_num()
	{
		re = 0;
		im = 0;
	}

	Complex_num(double re = 0, double im = 0) {
		this->re = re;
		this->im = im;
	}

	Complex_num(const Complex_num& other) {
		this->re = other.re;
		this->im = other.im;
	}

	Complex_num(Complex_num&& other) noexcept {
		this->re = other.re;
		this->im = other.im;
	}

	// Нахождение модуля комплексного числа
	double mod(int a, int b) {
		return sqrt(a * a + b * b);
	}
	// Нахождение аргумента комплексного числа
	double arg(int a, int b) {
		return atan(double(im) / re);
	}
	// Перегрузка оператора сложения для комплексного
	Complex_num operator+(Complex_num other)
	{
		double re = this->re + other.re;
		double im = this->im + other.im;
		return Complex_num(re, im);
	}
	// Перегрузка оператора сложения для вещественного
	Complex_num operator+(double other)
	{
		double re = this->re + other;
		double im = this->im;
		return Complex_num(re, im);
	}
	// Перегрузка оператора разности для комплексного
	Complex_num operator-(Complex_num other)
	{
		double re = this->re - other.re;
		double im = this->im - other.im;
		return Complex_num(re, im);
	}
	// Перегрузка оператора разности для вещественного
	Complex_num operator-(double other)
	{
		double re = this->re - other;
		double im = this->im;
		return Complex_num(re, im);
	}
	// Перегрузка оператора умножения для комплексного
	Complex_num operator*(Complex_num other) {
		double re = this->re * other.re - this->im * other.im;
		double im = this->re * other.im + this->im * other.re;
		return Complex_num(re, im);
	}
	// Перегрузка оператора умножения для вещественного
	Complex_num operator*(double other) {
		double re = this->re * other;
		double im = this->im * other;
		return Complex_num(re, im);
	}
	// Перегрузка оператора деления для вещественного
	Complex_num operator/(double other) {
		double re = this->re / other;
		double im = this->im / other;
		return Complex_num(re, im);
	}
	// Оператор сравнения на равенство
	bool operator==(Complex_num other) {
		return this->re == other.re && this->im == other.im;
	}
	// Оператор сравнения на неравенство
	bool operator!=(Complex_num other) {
		return this->re != other.re || this->im != other.im;
	}
	// Оператор присвоения возвращает ссылку
	Complex_num& operator=(Complex_num other) {
		this->re = other.re;
		this->im = other.im;
		return *this;
	}
	// Оператор преобразования типа неявный
	operator double() const
	{
		return re;
	}
	// Оператор преобразования типа явный
	explicit operator int() const
	{
		return int(round(re));
	}
	// Оператор () вытаскивает ссылку! на действительную часть
	double& operator()() {
		return re;
	}
	// Операторы действующий с потоками могут быть перегружены ТОЛЬКО через дружественные функции
	friend istream& operator>> (istream& in, Complex_num& matrix);
	friend ostream& operator<< (ostream& out, Complex_num& matrix);
};
istream& operator>> (istream& in, Complex_num& num)
{
	cout << "Введите целую часть:";
	in >> num.re;
	cout << "Введите мнимую часть:";
	in >> num.im;
	return in;
}
ostream& operator<< (ostream& out, Complex_num& num)
{
	if (num.re != 0)
		out << num.re;
	if ((num.re == 0 && num.im > 0) || num.im < 0)
		out << num.im << "*i";
	else
		out << "+" << num.im << "*i";
	return out;
}