#if ! defined(_COMPLEX_H_) /* 避免重複 include */ #define _COMPLEX_H_ typedef struct { /* 複數型別 */ double re, im; /* 實部與虛部 */ } complex; complex complex_add(complex a, complex b); double complex_abs(complex a); double complex_angle(complex a); complex polar_to_complex(double abs, double angle); complex complex_sqrt(complex a); void print_complex(complex a); /* 作業: 加入以下副程式: 減法, 乘法, 除法 */ #endif /* 名稱: complex.c 作者: 洪朝貴 http://www.cyut.edu.tw/~ckhung/ 功能: 複數模組 (簡單版) */ /* #include "complex.h" */ #include #include complex complex_add(complex a, complex b) /* 複數的加法 */ { complex result; result.re = a.re + b.re; result.im = a.im + b.im; return result; } double complex_abs(complex a) /* 求 a 的絕對值 */ { return sqrt(a.re * a.re + a.im * a.im); } double complex_angle(complex a) /* 求 a 的角度 */ { return atan2(a.im, a.re); } complex polar_to_complex(double abs, double angle) /* 將複數的 "極坐標表示法" 轉換為 "實部虛部表示法" */ { complex result; result.re = abs * cos(angle); result.im = abs * sin(angle); return result; } complex complex_sqrt(complex a) /* 開根號 */ { /* 極坐標表示法比較方便計算開根號, 所以 ... 實部虛部表示法 -> 極坐標表示法 -> 開根號 -> 實部虛部表示法 */ return polar_to_complex( sqrt(complex_abs(a)), /* 長度開根號 */ complex_angle(a)/2 /* 角度變成一半 */ ); } void print_complex(complex a) /* 印出複數 a */ { printf("(%g+%gi)", a.re, a.im); } #if defined(TEST) /* 測試程式: 以 "gcc -Wall -DTEST complex.c -lm" 編譯, 以 "a.out 3 4" 測試 */ #include #include /* 用到 atof */ int main(int argc, char * argv[]) { complex z; assert(3 == argc); z.re = atof(argv[1]); z.im = atof(argv[2]); printf("input value z: "); print_complex(z); putchar('\n'); printf("sqrt(z): "); print_complex(complex_sqrt(z)); putchar('\n'); printf("z + z: "); print_complex(complex_add(z, z)); putchar('\n'); return 0; } #endif