You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.3 KiB

#pragma once
#include "fractions.hpp"
#include <iostream>
class cnumber {
private:
fraction r, i;
public:
// Constructor
cnumber() {
r = 0;
i = 0;
}
cnumber(const cnumber &z) {
r = z.r;
i = z.i;
}
cnumber(const fraction &a, const fraction &b) {
r = a;
i = b;
}
cnumber(const fraction &a) {
r = a;
i = 0;
}
cnumber(int a, int b) {
r = a;
i = b;
}
cnumber(int a) {
r = a;
i = 0;
}
cnumber(double a, double b) {
r = a;
i = b;
}
cnumber(double a) {
r = a;
i = 0;
}
~cnumber() {}
// Member functions
cnumber conjugate() const {
fraction a(this->r.get_n(), this->r.get_d());
fraction b(this->i.get_n(), this->i.get_d());
cnumber z(a, b * -1);
return z;
}
// Operators
cnumber operator+(const cnumber &that) const {
cnumber z(this->r + that.r, this->i + that.i);
return z;
}
cnumber operator-(const cnumber &that) const {
cnumber z(this->r - that.r, this->i - that.i);
return z;
}
cnumber operator*(const cnumber &that) const {
cnumber z((that.r * this->r) - (that.i * this->i),
(that.r * this->i) + (this->r * that.i));
return z;
}
cnumber operator*(const fraction &q) const {
cnumber that(q, fraction(0));
return *this * that;
}
cnumber operator/(const cnumber &that) const {
cnumber numerator((this->r * that.r) - (this->i * (that.i * -1)),
(this->r * (that.i * -1)) + (that.r * this->i));
cnumber denominator((that.r * that.r) - (that.i * (that.i * -1)),
(that.r * (that.i * -1)) + (that.r * that.i));
cnumber ratio(numerator.r / denominator.r, numerator.i / denominator.r);
return ratio;
}
friend std::ostream &operator<<(std::ostream &os, const cnumber &z) {
if (z.r != 0) {
os << z.r;
if ((z.i.get_sign() == 1) && (z.i > 0)) {
os << '+';
}
}
if (z.i != 0) {
if ((z.i != 1) && (z.i != -1)) {
os << z.i;
} else if (z.i == -1) {
os << '-';
}
os << 'i';
}
if (z.r == 0 && z.i == 0) {
os << '0';
}
return os;
}
void operator=(const cnumber &z) {
r = z.r;
i = z.i;
}
const bool operator==(const cnumber &z) const { return r == z.r && i == z.i; }
const bool operator!=(const cnumber &z) const { return r != z.r || i != z.i; }
};