プログラム初心者で以下の問題が検討すらできません。どなたか参考にどのようなプログラムになるか教えてください。
抵抗とコンデンサからなる並列回路の複素インピーダンスとその絶対値を求めるプログラムを作成。
プログラムは、抵抗の値、コンデンサの容量、周波数を入力すると、複素インピーダンスとその絶対値を求めその結果を表示するものである。
私の解答です
/*
* mycomplex.c: 複素数関数
*/
#include <stdio.h>
#include <math.h>
#include "mycomplex.h"
/* 複素数の文字列を作る */
char *printc(mycomplex z)
{
static char str[BUFSIZ];
sprintf(str, "(%lf, %lf)", real(z), imag(z));
return str;
}
/* 実数と虚数を与えて複素数を作る */
mycomplex mkcomplex(double r, double i)
{
mycomplex z;
z.re = r;
z.im = i;
return z;
}
/* 絶対値と偏角を与えて複素数を作る */
mycomplex mkcomplex_at(double abs, double theta)
{
mycomplex z;
z.re = abs * cos(theta);
z.im = abs * sin(theta);
return z;
}
/* ノルム */
double norm(mycomplex z)
{
return z.re * z.re + z.im * z.im;
}
/* 絶対値 */
double cabs(mycomplex z)
{
return sqrt(norm(z));
}
/* 偏角 */
double carg(mycomplex z)
{
return atan2(z.im, z.re);
}
/* 共役複素数 */
mycomplex conj(mycomplex a)
{
mycomplex z;
z.re = a.re;
z.im = 0.0 - a.im;
return z;
}
/* 逆数 */
mycomplex cinv(mycomplex a)
{
mycomplex z;
double n;
n = norm(a);
z.re = a.re / n;
z.im = 0.0 - a.im / n;
return z;
}
/* 加算 */
mycomplex cadd(mycomplex a, mycomplex b)
{
mycomplex z;
z.re = a.re + b.re;
z.im = a.im + b.im;
return z;
}
/* 減算 */
mycomplex csub(mycomplex a, mycomplex b)
{
mycomplex z;
z.re = a.re - b.re;
z.im = a.im - b.im;
return z;
}
/* 乗算 */
mycomplex cmul(mycomplex a, mycomplex b)
{
mycomplex z;
z.re = a.re * b.re - a.im * b.im;
z.im = a.re * b.im + a.im * b.re;
return z;
}
/* 除算 */
mycomplex cdiv(mycomplex a, mycomplex b)
{
mycomplex z;
double n;
n = norm(b);
z.re = (a.re * b.re + a.im * b.im) / n;
z.im = (a.im * b.re - a.re * b.im) / n;
return z;
}
/* sin */
mycomplex csin(mycomplex a)
{
mycomplex z;
double ep;
ep = exp(a.im);
z.re = sin(a.re) * (ep + 1.0 / ep) / 2.0;
z.im = cos(a.re) * (ep - 1.0 / ep) / 2.0;
return z;
}
/* cos */
mycomplex ccos(mycomplex a)
{
mycomplex z;
double ep;
ep = exp(a.im);
z.re = cos(a.re) * (ep + 1.0 / ep) / 2.0;
z.im = sin(a.re) * (1.0 / ep - ep) / 2.0;
return z;
}
/* tan */
mycomplex ctan(mycomplex a)
{
return cdiv(csin(a), ccos(a));
}
/* exp */
mycomplex cexp(mycomplex a)
{
mycomplex z;
double ep;
ep = exp(a.re);
z.re = ep * cos(a.im);
z.im = ep * sin(a.im);
return z;
}
/* log 自然対数 (natural logarithm) */
mycomplex clog(mycomplex a)
{
mycomplex z;
z.re = log(norm(a)) / 2.0;
z.im = atan2(a.im, a.re);
return z;
}
/* log10 常用対数 (logarithm to base 10) */
mycomplex clog10(mycomplex a)
{
mycomplex z;
z.re = M_LOG10E * log(norm(a)) / 2.0;
z.im = M_LOG10E * atan2(a.im, a.re);
return z;
}