• 締切済み

プログラム初心者で以下の問題が検討すらできません。どなたか参考にどのようなプログラムになるか教えてください。

抵抗とコンデンサからなる並列回路の複素インピーダンスとその絶対値を求めるプログラムを作成。 プログラムは、抵抗の値、コンデンサの容量、周波数を入力すると、複素インピーダンスとその絶対値を求めその結果を表示するものである。 私の解答です /* * 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; }

  • 12gop
  • お礼率30% (3/10)

みんなの回答

  • morigann
  • ベストアンサー率17% (57/329)
回答No.3

main文は無い、関数のコール元も一切無い・・・ そんなんで他人に意見求めても無理というものです。 同じぐらいの時刻に貴方様からもうひとつ似たようなご質問がありますが、そこに書かれているソースが貴方様の実力とお見受けします。 これが大学の課題(レポート)ならば、それで単位を取ろうと思ってる事が『誤り』です。 例え回答がもらえたとしても、もう少し勉強しないと回答の意味すら分からないでしょう。

noname#39970
noname#39970
回答No.2

実際に動かしてみた? 適当にprintfを入れてデバグすると どこがおかしいか判るよ     多分。

  • kazusone
  • ベストアンサー率54% (33/61)
回答No.1

このプログラムを動くようにしたいのですか? プログラムに含まれる誤りを教えて欲しいのですか? まず、使っていない関数は削除しましょう。 丸投げは賢明な問い方ではないと思います。

12gop
質問者

補足

誤りを教えてほしいです。 どこを削除すればよろしいですか?

関連するQ&A

  • exp(z)について

    はじめまして、次の問題の解き方がまったくわかりません。なにをどうしていいのかもわからないので解き方、方針を教えてください。 (1)ζ≠0∈Cに対し、exp(z)=ζをみたす複素数zをすべて求めよ。 (2)f(z)=exp(z)としたとき、2直線Re(Z)=a,   Im(z)=bのfによる像を書け。(考え方をお願いします。)さらに長方形の閉領域a≦Re(z)≦b,c≦Im(z)≦dのfによる像を図示せよ。 よろしくお願いします。

  • 複素関数 

    複素数(1 + i)^50 - (1 - i)^50 の偏角と絶対値の求め方について 与式=exp(50*log(1+i)) - exp(50*log(1-i)) = exp(50*log√2) *{ cos(25π/2 + nπ/25) + i sin(25π/2 + nπ/25) - cos(-25π/2 + nπ/25) - i sin(-25π/2 + nπ/25)} = exp(50*log√2) *{ cos(π/2 + nπ/25) + i sin(π/2 + nπ/25) - cos(-π/2 + nπ/25) - i sin(-π/2 + nπ/25)} 加法定理を使って整理 与式= -2exp(50log√2) * (sin (nπ/25) - i * cos ( nπ/25 ) ) | z | = 2exp(50 log√2), 偏角 nπ/25 (n = 0, 1, 2, .....) というやり方でよろしいでしょうか? 偏角は nπ/25 なのでしょうか?

  • この問題の採点をお願いします。

    tは0< t <πを満たす実数とする。 a[n]は数列です。 a[1] = cos t/2 a[n] = a [n-1](cos t/2^n) (n= 2, 3, ・・) のときに、a[n]をtを用いて表せ。 ------- いま 0< t <π, n≧2より, 0 < t/2^n <π/2^2=π/4より、0 < cos t/n^2である。 0< t/2 <π/2より 次に、a[1] = cos t/2 > 0である。つまり正、したがって、a[2] > 0となる。順次、この議論を 繰り返せば、帰納的にa[n] > 0である。 次に与式の対数(底はe)を取る n≧2のとき log a[n] = log a[n-1] + log cos t/2^n log a[n-1] = log a[n-2] + log cos t/2^(n-1) ・・ log a[2] = log a[1] + log cos t/2^2 上記を足し算すれば、log a[n] = log a[1] + log cos t/2^2 + ・・ + log cos t/2^(n-1) + log cos t/2^n log a[n] = log cos t/2 ・cos t/2^2 + ・・cos t/2^(n-1) ・cos t/2^n となる。 ---------------b ここで、 cos t/2 = sin t /2sin t/2 cos t/2^2 = {sin 2・t/4} / { 2sin t/4 }・・ cos t/2^n = {sin t/2^(n-1)} / {2sin t/2^n} となり、上記に代入して、分子分母を消去すると、a[n] = sin t / {2^n sin t/n^2} となる。 一応最後の答えは一致したのですが、不安なのが、-----------bより下の部分です。 やっぱり、cos t/2^n = 2sin t/2^n cost/2^n/ 2sin t/2^n を帰納法で証明したほうがいいですか?

  • yaccとlexで、logや三角関数を含む電卓を作るプログラムの組み方

    今、yaccとlexで、logや三角関数を含む電卓を作るプログラムを作成しています。四則演算は実装できました。パイも実装できました。しかしlogや三角関数sin,cos,tanやabs,expなどがどうしても実装できません。以下のプログラムをlinux上のターミナルで実行しsin(90)やlog(90)どと入力しても、sintax errorと返されてしまいます。ちなみに実行時は-lmオプションは付けています。どうしたらこれらが実装できるのでしょうか。ご教授願えると幸いです。 ■yaccの.yファイル■ %{ #define YYSTYPE double #define PAICONST 3.14159265358979 #include <stdio.h> #include <math.h> double mcon=PAICONST/180.0; %} %token NL NUM LP RP END %left ADD SUB %left MUL DIV %left Pai Abs Sqrt Sin Cos Tan Log Exp NEG %% s : list ; list : /* empty */ | list expr NL { printf ("result: %lf\n", $2);} | list END { return;} ; expr : expr ADD expr {$$ = $1 + $3;} | expr SUB expr {$$ = $1 - $3;} | expr MUL expr {$$ = $1 * $3;} | expr DIV expr {$$ = $1 / $3;} | SUB expr %prec NEG {$$ = -$2;} | LP expr RP {$$ = $2;} | NUM {$$ = $1;} | Pai {$$=PAICONST;} | Abs "(" expr ")" {$$=abs($3);} | Sqrt "(" expr ")" {$$=sqrt($3);} | Sin "(" expr ")" {$$=sin($3*mcon);} | Cos "(" expr ")" {$$=cos($3*mcon);} | Tan "(" expr ")" {$$=tan($3*mcon);} | Log "(" expr ")" {$$=log($3);} | Exp "(" expr ")" {$$=exp($3);} ; %% yyerror(s) char *s; { printf ("%s\n",s);} main() { yyparse(); } #include "lex.yy.c" ■lexの.lファイル■ %{ #include <math.h> #include <ctype.h> %} %% "+" return (ADD); "-" return (SUB); "*" return (MUL); "/" return (DIV); "(" return (LP); ")" return (RP); "." return (END); (pai|PAI) return(Pai); (abs|ABS) return(Abs); (sqrt|SQRT) return(Sqrt); (sin|SIN) return(Sin); (cos|COS) return(Cos); (tan|TAN) return(Tan); (log|LOG) return(Log); (exp|EXP) return(Exp); [0-9]+\.[0-9]*|[0-9]+ { sscanf (yytext, "%lf", &yylval); return (NUM); } [ \t] ; ^\n return (END); \n return (NL); . return (yytext[0]); %%

  • c言語の、voidの使い方で困っています

    C言語の問題を教えて下さい。 この問題で困っています。 複素数z1,z2の引き算、掛け算を計算する構造体complexを引数、 戻り値とする関数 complex hikizan(complex z1,complex z2) complex kakezan(complex z1,complex z2) を作成し、 複素数を画面に表示する関数 void show(complex x) で結果を表示するプログラムを作りなさいという問題です。 z1=1+3i z2=2+2i です。 作ってみたのですが、void show(complex x)を使う方法が分かりません。 教えて下さい、お願いします。 以下、作ったプログラムです #include<stdio.h> typedef struct complex{ double re; double im; } complex; complex hikizan(complex z1,complex z2) { complex z; z.re=z1.re-z2.re; z.im=z1.im-z2.im; return z; } complex kakezan(complex z1,complex z2) { complex zz; zz.re=z1.re*z2.re-z1.im*z2.im; zz.im=z1.re*z2.im+z1.im*z2.re; return zz; } int main(void) { complex z1,z2,z,zz; z1.re=1; z1.im=3; z2.re=2; z2.im=2; z=hikizan(z1,z2); zz=kakezan(z1,z2); printf("z1-z2=%f+%fi \n",z.re,z.im); printf("z1*z2=%f+%fi \n",zz.re,zz.im); }

  • 複素数の積分

    『∫exp(-z^2)dzを z=√at+b/2√a (a≠0,-∞<t<∞)の経路上で積分せよ。  ただし、a、bは複素定数とする。』 という問題で a=r exp(iθ) (r>0、-π<θ≦π)とすると、 √a=√r exp[i(θ+2kπ)/2] (k=0,1)ですが この問題の積分経路を実際に複素数平面上に図示すると、直線はb≠0のときは原点を通らず、 直線の動き方が、Re(√a)>0の場合は左から右へ、 Re(√a)=0かつIm(√a)>0の場合は下から上へ、 Re(√a)=0かつIm(√a)<0の場合は上から下へ、 Re(√a)<0の場合は右から左へ動く事が分かりました。  ここから、どうすればよいのでしょうか?これは以下の質問http://www.okweb.ne.jp/kotaeru.php3?q=441692から発生した問題です。

  • 指数関数論

    目標は f(a,z)=a^z (a,z∈C) を完全に定義することです 1. a^0=1 2. n∈N ⇒ a^n=a^(n-1)*a 3. n∈N,a≠0 ⇒ a^(-n)=1/(a^n) 4. e^z=Σ[n=0~∞](z^n/n!) 5. Im(w)∈[0,2π) ⇒ ( w=Log(z) :⇔ z=e^w ) 6. R>=0,Re(θ)=0 ⇒ Log(Re^(iθ)):=Log(Re^mod(θ,2π))  (偏角の拡張)  * mod(θ,2π):=θ-2π*[θ/2π] とします 7. a^z=e^(z*Log(a)) とりあえず、ここでは、1価関数になるように Logで主値を考えましたが、多価関数として扱えるように することもできると思います このような形で定義すれば、 完全に複素数の範囲で指数関数を定義した ことになると思いますが、 どこか間違っている所、抜けてる所とかないでしょうか 4.の前に級数が収束することを示す必要がありますね. 5.で Im(w)∈[0,2π) を仮定した理由は welldefindにする為です だから、本当は 4. → 5.の間にe^zが単周期関数(周期2πi)で あることを示す必要があります 後、知りたいことは、不連続点の分布です わたし自身質問を把握しきれていないかもしれませんが 回答して補足してください mm(_ _)mm

  • ベクトル場の面積分の問題です。

    3次元のベクトル場(i,j,k) である、A=i+j , B=yi+xj それぞれについて、 (1)yz平面上の単位円についての面積分を求めよ。ただし、単位法線ベクトルの向きはx方向とする。 (2)原点中心の半径1の球の表面についての面積分を求めよ。 という問題なのですが、 積分する面をパラメータ表示してやってみたところ、 (1)(x,y,z)=(0,cosθ,sinθ) (0≦θ≦2π) N=(1,0,0) (ベクトルを大文字で表しました;) A・N=(1,1,0)・(1,0,0)=(1,0,0) B・N=(y,x,0)・(1,0,0)=(y,0,0) ∮A・NdS の dsの部分の求め方がいまいちわかりません; (2)では (x,y,z)=(sinθcosφ,sinθsinφ,cosθ) (0≦θ≦π,0≦φ≦2π) ds=|(cosθcosφ,cosθsinφ,-sinθ)×(-sinθsinφ,sinθcosφ,0)| dθdφ =sinθ dθdφ N=(x/2,y/2,z/2) A・N=x/2=(1/2)・sinθcosφ ∮A・NdS=(1/2)・∬(sinθ)^2・cosφ dθdφ =(π/4)・∫cosφ dφ =0? B・N=xy=(1/2)・(sinθ)^2・sin2φ ∮B・NdS=(1/2)・∬(sinθ)^3・sin2φ dθdφ =(4/3)・∫sin2φ dφ =0? となったのですがどこが間違っているかわかりません; どうか教えてくださいm(__)m

  • sinの値を求めるプログラムでお聞きします。

    cos(x)の値をcosのテーラー展開の式から求めるプログラムを作り、無限級数の項の絶対値が0.00001以下になったら打ち切って、コンピュータで定義されるcos(x)の値との差を 0.0≦x≦0.1 の範囲で0.01刻みに求めよ。ただし、結果はファイルに書き出すこと。 という問いがあり、プログラムは下記のようなものだったのですが、 #include <stdio.h> #include <math.h> double COS(double x); int main(void) { double a; FILE *fout; fout=fopen("file1.txt","w"); for(a=0;a<0.1;a=a+0.01) { fprintf(fout,"a=%f COS=%e cos=%e error=%e\n",a,COS(a),cos(a),COS(a)-cos(a)); } return 0; } double COS(double x) { double t; double y; int n; y=1.0; t=1.0; n=1; while(1) { t=-t*x*x/((2*n)*(2*n-1)); if(fabs(t)<=0.00001) break; y=y+t; n++; } return y; } これが、例えば、cos(x)ではなくsin(x)についてだった場合、上記の最初に書いてある条件もまったく同じでプログラムを作ったとすると、上記のプログラムのどこどのように変えればいいのでしょうか。 分からなくて困っています。助けてください。

  • sinの値を求めるプログラムで質問です。

    sin(x)の値を求めるプログラムで質問です。 cos(x)の値をcosのテーラー展開の式から求めるプログラムを作り、無限級数の項の絶対値が0.00001以下になったら打ち切って、コンピュータで定義されるcos(x)の値との差を 0.0≦x≦0.1 の範囲で0.01刻みに求めよ。ただし、結果はファイルに書き出すこと。 という問いがあり、プログラムは下記のようなものだったのですが、 #include <stdio.h> #include <math.h> double COS(double x); int main(void) { double a; FILE *fout; fout=fopen("file1.txt","w"); for(a=0;a<0.1;a=a+0.01) { fprintf(fout,"a=%f COS=%e cos=%e error=%e\n",a,COS(a),cos(a),COS(a)-cos(a)); } return 0; } double COS(double x) { double t; double y; int n; y=1.0; t=1.0; n=1; while(1) { t=-t*x*x/((2*n)*(2*n-1)); if(fabs(t)<=0.00001) break; y=y+t; n++; } return y; } これが、例えば、cos(x)ではなくsin(x)についてだった場合、上記の最初に書いてある条件もまったく同じでプログラムを作ったとすると、上記のプログラムのどこを変えればいいのでしょうか。どなたか教えてください。