#if ! defined(_COMPLEX_H_) // 避免重複 include #define _COMPLEX_H_ class complex { // 複數型別 public: double re, im; // 實部與虛部 complex operator +(complex const & b) const; complex operator +=(complex const & b); double abs() const; double angle() const; complex sqrt() const; void print() const; }; complex polar_to_complex(double abs, double angle); // 作業: 加入以下副程式: 減法, 乘法, 除法 #endif // 名稱: complex.cc // 作者: 洪朝貴 http://www.cyut.edu.tw/~ckhung/ // 功能: 複數模組 // #include "complex.h" #include #include complex complex::operator +(complex const & b) const { complex result; result.re = re + b.re; result.im = im + b.im; return result; } 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 // 角度變成一半 ); } void complex::print() const { printf("(%g+%gi)", re, im); } complex polar_to_complex(double abs, double angle) // 將複數的 "極坐標表示法" 轉換為 "實部虛部表示法" { complex result; result.re = abs * cos(angle); result.im = abs * sin(angle); return result; } #if defined(TEST) // 測試程式: 以 "g++ -Wall -DTEST complex0.cc" 編譯, 以 "a.out 3 4" 測試 #include #include // 用到 atof int main(int argc, char * argv[]) { complex z, sz, t; assert(3 == argc); z.re = atof(argv[1]); z.im = atof(argv[2]); printf("input value z is: "); z.print(); putchar('\n'); printf("sz = z.sqrt() is: "); sz = z.sqrt(); sz.print(); putchar('\n'); printf("z + z: "); t = z + z; t.print(); putchar('\n'); printf("z += sz: "); z += sz; z.print(); putchar('\n'); printf("Now z becomes: "); z.print(); putchar('\n'); return 0; } #endif