#if ! defined(_COMPLEX_H_) // 避免重複 include #define _COMPLEX_H_ #include class complex { // 複數型別 public: complex(double r = 0, double i = 0); complex operator +(complex const & b) const; complex operator +=(complex const & b); double abs() const; double angle() const; complex sqrt() const; friend ostream & operator << (ostream & os, complex c); private: double re, im; // 實部與虛部 }; complex polar_to_complex(double abs, double angle); // 作業: 加入以下副程式: 減法, 乘法, 除法 #endif // 名稱: complex.cc // 作者: 洪朝貴 http://www.cyut.edu.tw/~ckhung/ // 功能: 複數模組 // #include "complex.h" #include complex::complex(double r, double i) : re(r), im(i) { } complex complex::operator +(complex const & b) const { return complex(re + b.re, im + b.im); } complex complex::operator +=(complex const & b) { re += b.re; im += b.im; return *this; } double complex::abs() const // 絕對值 { return ::sqrt(re * re + im * im); } double complex::angle() const // 角度 { return atan2(im, re); } complex complex::sqrt() const // 開根號 { // 極坐標表示法比較方便計算開根號, 所以 ... // 實部虛部表示法 -> 極坐標表示法 -> 開根號 -> 實部虛部表示法 return polar_to_complex( ::sqrt(abs()), // 長度開根號 angle()/2 // 角度變成一半 ); } complex polar_to_complex(double abs, double angle) // 將複數的 "極坐標表示法" 轉換為 "實部虛部表示法" { return complex(abs * cos(angle), abs * sin(angle)); } ostream & operator << (ostream & os, complex c) { return os << '(' << c.re << '+' << c.im << 'i' << ')'; } #if defined(TEST) // 測試程式: 以 "g++ -Wall -DTEST complex.cc" 編譯, 以 "a.out 3 4" 測試 #include #include // 用到 atof int main(int argc, char * argv[]) { assert(3 == argc); complex z(atof(argv[1]), atof(argv[2])); cout << "input value z is: " << z << endl; complex sz = z.sqrt(); cout << "sz = z.sqrt() is: " << sz << endl; cout << "z + z: " << z + z << endl; cout << "z += sz: " << (z += sz) << endl; return 0; } #endif