/* This Class Header */ #include "Complex7.h" /* Collaborating Class Header */ /* Base Class Headers */ /* C++ Headers */ #include /* ====================================================================== */ /* Constructor */ template Complex::Complex(const T& re, const T& im) { theReal = re; theImag = im; } /* Operations */ template T Complex::re() const { return theReal; } template T Complex::im() const { return theImag; } template Complex Complex::coniugate() const { return Complex(re(),-im()); } template Complex Complex::inverse() const { return 1./mod2()*coniugate(); } template T Complex::mod2() const { return re()*re()+im()*im(); } template T Complex::mod() const { return sqrt(mod2()); } template Complex operator+(const Complex& lhs, const Complex& rhs) { return Complex(lhs.re()+rhs.re(), lhs.im()+rhs.im()); } template Complex operator*(const Complex& lhs, const Complex& rhs) { return Complex(lhs.re()*rhs.re()-lhs.im()*rhs.im(), lhs.re()*rhs.im()+lhs.im()*rhs.re()); } template Complex operator-(const Complex& lhs) { return Complex(-lhs.re(), -lhs.im()); } template Complex operator-(const Complex& lhs, const Complex& rhs) { // lo implemento in termini di "opposto" e somma return (lhs+(-rhs)); } template Complex operator/(const Complex& lhs, const Complex& rhs){ // lo implemento con prodotto e inverso return lhs*rhs.inverse(); } template ostream& operator<<(ostream& out, const Complex& c) { out << "(" << c.re() << ( c.im()<0 ? " - i " : " + i ") << fabs(c.im()) << ")" ; return out; } template istream& operator>>(istream& in, Complex& o) { cout << "Syntax: a+ib eg 4+i1" << endl; T re, im; // controllo primo carattere char c = in.peek(); // se e' un "invio" allora crea Complex default if (c == '\n' ) { o=Complex(); // questo e' il mio complesso in.ignore(); // dico di ignorare (saltare) l'ultimo carattere dell'ifstream return in; // devi sempre ritornare l'ifstream! } in >> re; c = in.peek(); if (c == '\n' ) { o=Complex(re); in.ignore(); return in; } // controllo che il prox carattere sia un + come previsto c = in.peek(); if (c=='+') in.ignore(); else { // che faccio??? // Io non lo so proprio, devo notificare a chi sta inserendo // il mio complesso che ha sbagliato cout << "Sintassi non valida! " << endl; // sollevo un'eccezione throw exception(); } // Come sopra, il prox deve essere una "i" c = in.peek(); if (c=='i') in.ignore(); else { cout << "Sintassi non valida! " << endl; throw exception(); } // prendo la parte immaginaria in >> im; o=Complex(re,im); return in; }