6回目 課題の解答・解説
ヘッダファイル complex.h の例 struct Complex { double re; double im; }; Complex ToComplex(double x, double y); /* 実数2つから複素数を生成 */ void Cdisp(Complex z); /* 複素数を画面に表示 */ Complex Cinp(void); /* キーボードから実部,虚部を入力して複素数を返す */ Complex Cadd(Complex a, Complex b); /* 複素数 a, b の和を返す */ Complex Csub(Complex a, Complex b); /* 差 */ Complex Cmul(Complex a, Complex b); /* 積 */ Complex Cdiv(Complex a, Complex b); /* 商 */ Complex Conj(Complex z); /* 共役な複素数を返す */ double Cabs(Complex z); /* 絶対値 */ double Carg(Complex z); /* 偏角 */ Complex Cexp(Complex z); /* 指数関数 */ |
|
実装ファイル complex.cpp の例 #include <stdio.h> #include <math.h> #include "complex.h" /* ファイル名は各自で変更 */ Complex ToComplex(double x, double y) // 実数x,yから複素数を作り,戻り値として返す関数 { Complex z; z.re = x; z.im = y; return z; } void Cdisp(Complex z) /*便利機能、出力*/ { printf("(re,im) = (%g,%g)",z.re,z.im); } Complex Cinp(void) // キーボードから実部,虚部を入力して返す { Complex z; char c, s1[BUFSIZ], s2[BUFSIZ]; printf("実数部は?"); scanf("%s",s1); printf("虚数部は?"); scanf("%s",s2); z.re = atof(s1); z.im = atof(s2); return z; } Complex Cadd(Complex a, Complex b) // 複素数の和の例. { Complex z; z.re = a.re + b.re; z.im = a.im + b.im; return z; } Complex Csub(Complex a, Complex b) { Complex z; z.re = a.re - b.re; z.im = a.im - b.im; return z; } Complex Cmul(Complex a, Complex b) { Complex z; z.re = (a.re * b.re) - (a.im * b.im); z.im = (a.re * b.im) + (b.re * a.im); return z; } Complex Cdiv(Complex a, Complex b) { Complex z; z.re = ( (a.re * b.re) + (a.im * b.im) )/( (b.re * b.re) + (b.im * b.im) ); z.im = ( (b.re * a.im) - (a.re * b.im) )/( (b.re * b.re) + (b.im * b.im) ); return z; } Complex Conj(Complex z) { z.im = -z.im; /*虚数部だけを呼び出し,符号を入れ替える*/ return z; } double Cabs(Complex z) { double x; x = sqrt(z.re * z.re + z.im * z.im); return x; } double Carg(Complex z) { double x; x = atan2(z.im, z.re); return x; } Complex Cexp(Complex z) // 指数関数 { Conplex zz zz.re= exp(z.re) * cos(z.im); zz.im= exp(z.re) * sin(z.im); return zz; } |
複素数を2つの変数の構造体として定義する Complex型の変数を用意 複素数のパラメータを与える 構造体として返す(実部,虚部をパラメータとして持つ) 複数数型変数zの実部及び虚部を表示する. BUFSIZは適宜 複素数の足し算 Complex型の引数aと引数bを渡す*/ 複素数aの実部と複素数bの実部を足す. 複素数の引き算 複素数の掛け算 複素数の割り算 共役複素数 *虚数部だけを呼び出し,符号を入れ替える 絶対値 偏角 x = atan(z.im / z.re);でもよい 指数関数 オイラーの式に基く 以下でもよい Complex Cexp(Complex z) /*指数関数*/ { Complex zz; zz.re = pow(exp(1), z.re) * cos(z.im); zz.im = pow(exp(1), z.im) * sin(z.im); return zz; } |