/* t4_4.c ( PASCAL講座 sample program ) 複素数の計算 コンパイル命令は gcc t4_4.c -o t4_4 -lm 実行命令は t4_4 */ #include #include #include typedef struct { double re,im; } complex; /* 実部・虚部を持つレコードとして複素数を定義 */ complex compadd(complex x, complex y) /* 複素数の加法 */ { complex z; z.re=(x.re)+(y.re); z.im=(x.im)+(y.im); return z; } complex compsub(complex x, complex y) /* 複素数の減法 */ { complex z; z.re=(x.re)-(y.re); z.im=(x.im)-(y.im); return z; } complex compmul(complex x, complex y) /* 複素数の乗法 */ { complex z; z.re=(x.re)*(y.re)-(x.im)*(y.im); z.im=(x.re)*(y.im)+(x.im)*(y.re); return z; } double compnorm(complex x) /* 複素数のノルム */ { return x.re*x.re+x.im*x.im; } complex compinv(complex x) /* 複素数の逆数 */ { complex z; double n=compnorm(x); z.re=x.re/n; z.im=-x.im/n; return z; } complex compdiv(complex x, complex y) /* 複素数の商 */ { return compmul(x,compinv(y)); } double compabs(complex x) /* 複素数の絶対値 */ { return sqrt(compnorm(x)); } complex compconj(complex x) /* 複素数の共役 */ { complex z; z.re=x.re; z.im=-x.im; return z; } void compprint(complex x) /* 複素数の出力 */ { printf("( "); if(x.re==0.0 && x.im==0.0) printf("0"); else{ if(x.re>0) printf("%7.5f",x.re); if(x.re<0) printf("- %7.5f",fabs(x.re)); if(x.im>0){ if(x.re!=0.0) printf(" + "); printf("%7.5f i",x.im); } if(x.im<0) printf(" - %7.5f i",fabs(x.im)); } printf(" )"); } void compprintln(complex x) /* 複素数の改行付き出力 */ { compprint(x); printf("\n"); } complex randomcomplex(double a) /* 絶対値 abs(a) 以下のランダムな複素数 */ { complex z; double b=fabs(a); z.re=b*(2.0*rand()/RAND_MAX-1); z.im=b*(2.0*rand()/RAND_MAX-1); return z; } main() { char n='Y'; complex a,b,c,d; printf("複素数の計算をします。\n"); do{ a=randomcomplex(5); b=randomcomplex(5); printf(" a = "); compprintln(a); printf(" b = "); compprintln(b); printf(" a + b = "); compprintln(compadd(a,b)); printf(" a - b = "); compprintln(compsub(a,b)); printf(" a * b = "); compprintln(compmul(a,b)); c=compdiv(a,b); printf(" a / b = "); compprintln(c); d=compmul(c,b); printf("(a / b) * b = "); compprintln(d); printf("\n"); printf("Next ? ( Y or N ) "); n=getchar(); }while(n!='N' && n!='n'); }