4回目課題解答


課題1 これらの関数ができればよい.

Complex Cexp(Complex a) /*指数関数*/
{
 Complex z;

 z.re = pow(exp(1), a.re) * cos(a.im);
 z.im = pow(exp(1), a.im) * sin(a.im);

 return z;
}
Complex Cpow(Complex a, double n) /*べき乗*/
{
 double rad, ang;
 Complex z;

 rad = Cabs(a);
 ang = Carg(a);

 z.re = pow(rad, n) * pow(cos(ang),n);
 z.im = pow(rad, n) * pow(sin(ang),n);

 return z;
}
Complex Crt(Complex a, int n, int k) /*n乗根*/
{
 double rad, ang;
 Complex z;

 if(k > n-1){
  printf("error:k\n");
  exit(1);
 }

 rad = Cabs(a);
 ang = Carg(a);

 z.re = pow(rad, 1/n) * cos( (ang + 2 * k * M_PI) / n);
 z.im = pow(rad, 1/n) * sin( (ang + 2 * k * M_PI) / n);

 return z;
}

Complex Csqrt(Complex a) /*平方根*/
{
 double rad = Cabs(a);
 Complex z;

 if(a.im >= 0) {
  z.re = sqrt(a.re + pow(rad,2)) / sqrt(2);
  z.im = z.re;
 }else{
  z.re = sqrt(a.re + pow(rad,2)) / sqrt(2);
  z.im = z.re * (-1);
}

 return z;
}

戻り値zは複素数型として返しているところが注目点

課題2 これらの関数ができればよい.

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;
}
複素数の実数部,虚数部を質問し,
それぞれ実数部,虚数部に代入する.
実数部,虚数部を文字列として認識し,
それを浮動小数点型に変換し,複数数型(構造体)の
実数部,虚数部に代入する.
void Cdisp(Complex z) /*便利機能、出力*/
{
 printf("(re,im) = (%g,%g)",z.re,z.im);
}
複数数型変数zの実部及び虚部を表示する.