#include #include #include struct complex_struct { double r, A; }; double real_part(struct complex_struct z) { return z.r * cos(z.A); } double img_part(struct complex_struct z) { return z.r * sin(z.A); } double magnitude(struct complex_struct z) { return z.r; } double angle(struct complex_struct z) { return z.A; } struct complex_struct make_from_real_img(double x, double y) { struct complex_struct z; z.A = atan2(y, x); z.r = sqrt(x * x + y * y); return z; } struct complex_struct make_from_mag_ang(double r, double A) { struct complex_struct z; z.r = r; z.A = A; return z; } struct complex_struct add_complex(struct complex_struct z1, struct complex_struct z2) { return make_from_real_img(real_part(z1) + real_part(z2), img_part(z1) + img_part(z2)); } struct complex_struct sub_complex(struct complex_struct z1, struct complex_struct z2) { return make_from_real_img(real_part(z1) - real_part(z2), img_part(z1) - img_part(z2)); } struct complex_struct mul_complex(struct complex_struct z1, struct complex_struct z2) { return make_from_mag_ang(magnitude(z1) * magnitude(z2), angle(z1) + angle(z2)); } struct complex_struct div_complex(struct complex_struct z1, struct complex_struct z2) { return make_from_mag_ang(magnitude(z1) / magnitude(z2), angle(z1) - angle(z2)); } //打印复数 属于复数运算层,调用复数表示层 void printf_complex(struct complex_struct z) { if(abs(real_part(z))<0.1&&abs(img_part(z))>=0.1) //浮点型不能直接判断是否为0,这里因为输出只保留小数点后1位,所以认为小于0.1的就为0 printf("%.1fi\n",img_part(z)); else if(abs(real_part(z))>=0.1&&abs(img_part(z))<0.1) printf("%.1f\n",real_part(z)); else if(abs(real_part(z))<0.1&&abs(img_part(z))<0.1) printf("0\n"); else printf("%.1f+%.1fi\n",real_part(z),img_part(z)); } int main(int argc, char* argv[]) { struct complex_struct z1=make_from_real_img(0,2); struct complex_struct z2=make_from_real_img(0,1); printf("z1+z2="); printf_complex(add_complex(z1,z2)); printf("z1-z2="); printf_complex(sub_complex(z1,z2)); printf("z1*z2="); printf_complex(mul_complex(z1,z2)); printf("z1/z2="); printf_complex(div_complex(z1,z2)); system("pause"); }