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;
}