値の渡し方?(初心者)

このQ&Aのポイント
  • 関数の中では、計算は正しく行われていて、結果が正しいことが分かりましたが、メイン文の出力では、変な値が出てきてしまいます。値の渡し方がおかしいのでしょうか?
  • プログラムについて新たに質問です。メインプログラムと関数プログラムを組みましたが、メイン文の出力に変な値が出てきてしまいます。値の渡し方がおかしいのでしょうか?
  • 関数の中では計算は正しく行われていることが分かりましたが、メイン文の出力に変な値が出てきてしまいます。値の渡し方が間違っているのかどうか、アドバイスをお願いします。
回答を見る
  • ベストアンサー

値の渡し方?(初心者)

以前質問したプログラムについて、新たに質問です。 メインプログラムと、関数プログラムを組みました。 関数の中では、print文を使うと計算は正しく行われていて、結果が正しいことが分かりました。 でうが、メイン文の出力では、どこにも出てこない変な値が出てきてしまいます。 値の渡し方がおかしいのでしょうか? 誰か、アドバイスをお願いします。 ***以下プログラムです。*** #include <stdio.h> #include <math.h> double gamma(double x) { double c[9],y,a,r,b,s,z; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<9;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1.,b)))*((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*r; printf("4 %lf\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム x= %lf \n",x); y=gamma(x); printf("x= %f y= %f\n",x,y); }

  • acac
  • お礼率60% (14/23)

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

質問で提示のプログラムをいくつかの環境で(*)動かして見ましたが、いずれも 4の printf() で出力した値と、main() の printf() は、同じ値が出ます。 使っているコンパイラとOSは何ですか?   (*) unix の cc     Windows の VC++4.2     Windows の gcc 2.95.2

acac
質問者

お礼

前回のアドバイスの通りちゃんとやってみたら、ちゃんとできてました。 次点にしてしまって申し訳ありませんでした…m(__)m ちなみに、結局間違っていたのは配列の添え字の使い方でですか? あと、変数の%lfと%fの問題ですか? なんだか腑に落ちないんですけどね…次にまた同じところで引っかかってしまうのではないかと心配です。 でも、とにかくたくさんお世話になりました!! ありがとうございます。

その他の回答 (3)

noname#30727
noname#30727
回答No.4

読み直してみたら、大ボケな事を書いてしまった事に気づきました。 printf の %lf で正しく表示されているのですね。 失礼しました。

noname#30727
noname#30727
回答No.3

motsuan さんの仰っている通りだと思います。 非常にまぎらわしいのですが、 scanf の %f は float を意味しますが、printf の %f は double を意味します。 printf の %lf が double でないコンパイラもあるので、printf 側は %f を使用するべきだと思います。

  • motsuan
  • ベストアンサー率40% (54/135)
回答No.2

printf("4 %lf\n",y); printf("x= %f y= %f\n",x,y); の%lfと%fの違い、 あるいは %lf でyの値が壊れているのではないでしょうか? ちなみに私のVC++6.0でも正常に動作しているようです。 printf("4 %lf\n",y); return y; を printf("4 %lf\n",y); printf("4 again %f\n",y); return y; とやってみるとわかるのではないでしょうか? ちなみに%lfって標準のfの標準のプレフィクスではないのではないでしょうか?

関連するQ&A

  • γ関数のプログラム(初心者です)

    以下のようにγ関数のプログラムを組みました。 とりあえず整数値を入力すれば、正しい値は返しているということがprintfの4で確認できました。 もとはfortranで組んだプログラムをCに置き換えました。 ですが、実際走らせてみると、4で値は確認できますがsegmentation faultが出てしまいます。 ですからサブルーチンファイル(ユーザー関数?)として利用できません。 何がいけないのでしょうか? 正しくyが帰ってくるようにどうなおしたらよいのか教えてください。 #include <stdio.h> #include <math.h> double gamma(double x) { double c[8],y,a,r,b,s; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<8;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1,b))) *((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*(r+(0.03586834*((double)(pow(-1,8)))*((double)(pow(x,8))))); printf("4 %f\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム %lf\n",x); y=gamma(x); printf("%f\n",y); }

  • 二分法のプログラムについて

    下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #define MAX 10 int n , count; double c[MAX+1]; double a,b,e; void nyuuryoku(void) { int i; printf("nの入力>"); scanf("%d",&n); if(n>MAX){printf("最大次数を超えている");exit(1);} else if(n<0){printf("nが負");exit(2);} else{for(i=0;i<=n;i++){printf("係数の値>");scanf("%lf",&c[i]);} }} double f(double x) {double y; int i; y = c[0]; for(i=1;i<=n;i++){ y=y*x+c[i];} return y; } void hani(void){ printf("aの値>");scanf("%lf",&a); printf("bの値>");scanf("%lf",&b); printf("eの値>");scanf("%lf",&e); if(e<=0){printf("eが0または負"); exit(3);} if(f(a)==0){printf("%f",f(a)); exit(4);} if(f(b)==0){printf("%f",f(b)); exit(5);} if(f(a)*f(b)>0){printf("初期値異常"); exit(6);}} double nibun(void) {double c; if(b>a){ while(b-a>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(a)*f(c)<0){b=c;} if(f(b)*f(c)<0){a=c;} } return a;} if(a>b){ while(a-b>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(b)*f(c)<0){a=c;} if(f(a)*f(c)<0){b=c;} } return a;} } void syutsuryoku(double x){ printf("x=%lf\n",x); printf("f(x)=%lf\n",f(x)); printf("繰り返し回数=%d\n",count); } int main(void){ double ans; count=0; nyuuryoku(); hani(); ans = nibun(); syutsuryoku(ans); }

  • このプログラムの実行結果についてお助け下さい2

    //U2のとき for(L=-A;L<=A;L++) { for(M=-B;M<=B;M++) { for(N=-C;N<=C;N++) { x=(2*L+1)*a*cos(Beta)/2; y=M*b+b/2; z=N*c-((2*L+1)*a*sin(Beta))/2; X=x-Px2; Y=y-Py2; Z=z-Pz2; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R){ if(L==0&&M==0&&N==0){ Hdx15=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy15=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz15=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==-1&&M==0&&N==0){ Hdx16=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy16=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz16=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==0&&M==0&&N==1){ Hdx17=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy17=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz17=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==-1&&M==0&&N==1){ Hdx18=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy18=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz18=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L=-1&&M==0&&N==-1){ Hdx19=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy19=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz19=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else{ Hdx=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); THDX22=THDX22+Hdx; THDY22=THDY22+Hdy; THDZ22=THDZ22+Hdz; printf("L=%d M=%d N=%d R=%lf\n",L,M,N,r); } } } } } Hdx20=Hdx15+Hdx16+Hdx17+Hdx18+Hdx19; Hdy20=Hdy15+Hdy16+Hdy17+Hdy18+Hdy19; Hdz20=Hdz15+Hdz16+Hdz17+Hdz18+Hdz19; printf("ここまでがlowerのU2の時のL,M,N、それぞれの値\n"); printf("THDX11は%eです。\n",THDX11); printf("THDY11は%eです。\n",THDY11); printf("THDZ11は%eです。\n",THDZ11); printf("THDX12は%eです。\n",THDX12); printf("THDY12は%eです。\n",THDY12); printf("THDZ12は%eです。\n",THDZ12); printf("THDX21は%eです。\n",THDX21); printf("THDY21は%eです。\n",THDY21); printf("THDZ21は%eです。\n",THDZ21); printf("THDX22は%eです。\n",THDX22); printf("THDY22は%eです。\n",THDY22); printf("THDZ22は%eです。\n",THDZ22); printf("\n"); Hdx21=THDX11+THDX12; Hdy21=THDY11+THDY12; Hdz21=THDZ11+THDZ12; Hdx22=THDX21+THDX22; Hdy22=THDY21+THDY22; Hdz22=THDZ21+THDZ22; printf("Hdx21は%eです。\n",Hdx21); printf("Hdy21は%eです。\n",Hdy21); printf("Hdz21は%eです。\n",Hdz21); printf("Hdx22は%eです。\n",Hdx22); printf("Hdy22は%eです。\n",Hdy22); printf("Hdz22は%eです。\n",Hdz22); Hdip1=sqrt((Hdx21*Hdx21)+(Hdy21*Hdy21)+(Hdz21*Hdz21)); Hdip2=sqrt((Hdx22*Hdx22)+(Hdy22*Hdy22)+(Hdz22*Hdz22)); printf("Hdip1は%eです。\n",Hdip1); printf("Hdip2は%eです。\n",Hdip2); upper=Hdip1*gamma; lower=Hdip2*gamma; printf("upperは%eです。\n",upper); printf("lowerは%eです。\n",lower); upper=0; lower=0; Hdip3=sqrt((Hdx4*Hdx4)+(Hdy4*Hdy4)+(Hdz4*Hdz4)+(Hdx10*Hdx10)+(Hdy10*Hdy10)+(Hdz10*Hdz10)); Hdip4=sqrt((Hdx14*Hdx14)+(Hdy14*Hdy14)+(Hdz14*Hdz14)+(Hdx20*Hdx20)+(Hdy20*Hdy20)+(Hdz20*Hdz20)); printf("抜き出した8個の原子の総合の磁場は、upperの方のHdip3は、%lf、\nlowerの方のHdip4は%lfです。\n",Hdip3,Hdip4); printf("これらを、また元の結晶に戻した時、\n"); upper=0;lower=0; Hdip5=sqrt((Hdx21*Hdx21)+(Hdy21*Hdy21)+(Hdz21*Hdz21)+(Hdx4*Hdx4)+(Hdy4*Hdy4)+(Hdz4*Hdz4)+(Hdx10*Hdx10)+(Hdy10*Hdy10)+(Hdz10*Hdz10)); Hdip6=sqrt((Hdx22*Hdx22)+(Hdy22*Hdy22)+(Hdz22*Hdz22)+(Hdx14*Hdx14)+(Hdy14*Hdy14)+(Hdz14*Hdz14)+(Hdx20*Hdx20)+(Hdy20*Hdy20)+(Hdz20*Hdz20)); upper=Hdip5*gamma; lower=Hdip6*gamma; printf("upperは%eです。\n",upper); printf("lowerは%eです。\n",lower); 以上です・・・。

  • このプログラムの実行結果についてお助け下さい2

    2、続きです。 ちなみに以前に同じ質問を投稿し、回答を頂いてそこを直すと正しく実行できたと勘違いして質問を終わらせてしまいました・・・。 //U2のとき for(L=-A;L<=A;L++) { for(M=-B;M<=B;M++) { for(N=-C;N<=C;N++) { x=(2*L+1)*a*cos(Beta)/2; y=M*b+b/2; z=N*c-((2*L+1)*a*sin(Beta))/2; X=x-Px2; Y=y-Py2; Z=z-Pz2; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R){ if(L==0&&M==0&&N==0){ Hdx15=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy15=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz15=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==-1&&M==0&&N==0){ Hdx16=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy16=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz16=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==0&&M==0&&N==1){ Hdx17=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy17=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz17=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==-1&&M==0&&N==1){ Hdx18=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy18=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz18=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L=-1&&M==0&&N==-1){ Hdx19=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy19=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz19=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else{ Hdx=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); THDX22=THDX22+Hdx; THDY22=THDY22+Hdy; THDZ22=THDZ22+Hdz; printf("L=%d M=%d N=%d R=%lf\n",L,M,N,r); } } } } } Hdx20=Hdx15+Hdx16+Hdx17+Hdx18+Hdx19; Hdy20=Hdy15+Hdy16+Hdy17+Hdy18+Hdy19; Hdz20=Hdz15+Hdz16+Hdz17+Hdz18+Hdz19; printf("ここまでがlowerのU2の時のL,M,N、それぞれの値\n"); printf("THDX11は%eです。\n",THDX11); printf("THDY11は%eです。\n",THDY11); printf("THDZ11は%eです。\n",THDZ11); printf("THDX12は%eです。\n",THDX12); printf("THDY12は%eです。\n",THDY12); printf("THDZ12は%eです。\n",THDZ12); printf("THDX21は%eです。\n",THDX21); printf("THDY21は%eです。\n",THDY21); printf("THDZ21は%eです。\n",THDZ21); printf("THDX22は%eです。\n",THDX22); printf("THDY22は%eです。\n",THDY22); printf("THDZ22は%eです。\n",THDZ22); printf("\n"); Hdx21=THDX11+THDX12; Hdy21=THDY11+THDY12; Hdz21=THDZ11+THDZ12; Hdx22=THDX21+THDX22; Hdy22=THDY21+THDY22; Hdz22=THDZ21+THDZ22; printf("Hdx21は%eです。\n",Hdx21); printf("Hdy21は%eです。\n",Hdy21); printf("Hdz21は%eです。\n",Hdz21); printf("Hdx22は%eです。\n",Hdx22); printf("Hdy22は%eです。\n",Hdy22); printf("Hdz22は%eです。\n",Hdz22); Hdip1=sqrt((Hdx21*Hdx21)+(Hdy21*Hdy21)+(Hdz21*Hdz21)); Hdip2=sqrt((Hdx22*Hdx22)+(Hdy22*Hdy22)+(Hdz22*Hdz22)); printf("Hdip1は%eです。\n",Hdip1); printf("Hdip2は%eです。\n",Hdip2); upper=Hdip1*gamma; lower=Hdip2*gamma; printf("upperは%eです。\n",upper); printf("lowerは%eです。\n",lower); upper=0; lower=0; Hdip3=sqrt((Hdx4*Hdx4)+(Hdy4*Hdy4)+(Hdz4*Hdz4)+(Hdx10*Hdx10)+(Hdy10*Hdy10)+(Hdz10*Hdz10)); Hdip4=sqrt((Hdx14*Hdx14)+(Hdy14*Hdy14)+(Hdz14*Hdz14)+(Hdx20*Hdx20)+(Hdy20*Hdy20)+(Hdz20*Hdz20)); printf("抜き出した8個の原子の総合の磁場は、upperの方のHdip3は、%lf、\nlowerの方のHdip4は%lfです。\n",Hdip3,Hdip4); printf("これらを、また元の結晶に戻した時、\n"); upper=0;lower=0; Hdip5=sqrt((Hdx21*Hdx21)+(Hdy21*Hdy21)+(Hdz21*Hdz21)+(Hdx4*Hdx4)+(Hdy4*Hdy4)+(Hdz4*Hdz4)+(Hdx10*Hdx10)+(Hdy10*Hdy10)+(Hdz10*Hdz10)); Hdip6=sqrt((Hdx22*Hdx22)+(Hdy22*Hdy22)+(Hdz22*Hdz22)+(Hdx14*Hdx14)+(Hdy14*Hdy14)+(Hdz14*Hdz14)+(Hdx20*Hdx20)+(Hdy20*Hdy20)+(Hdz20*Hdz20)); upper=Hdip5*gamma; lower=Hdip6*gamma; printf("upperは%eです。\n",upper); printf("lowerは%eです。\n",lower); 以上です・・・。

  • メインのscanfについて

    初心者でつたないプログラムで、大変未熟な内容とは思いますがお許しください…。 以下のようなプログラムを作り実行しました。 gamma(x)については、別のファイルにユーザー関数として定義しました。 このファイルをコンパイル・リンクして実行すると、入力されたxは、ちゃんと認識されずx=0として関数gamma(x)に渡されてしまいます。 で、正しい結果が出ません。 どう直したらいいのですか? 基本的なこととは思いますが,よろしくお願いします。 ======プログラム======= #include <stdio.h> main() { double x,y; printf("数字を入力してください。"); scanf("%f",&x); y=gamma(x); printf("%lf\n",y); } ======================

  • C++の繰り返し

    たびたび申し訳ありません.C++総和の質問です Microsoft Visual Basic 6.0の質問です. 以下の用に繰り返しの総和計算を書いたのですが,それぞれの総和が計算されず,例えば最もシンプルな総和sumも0となってしまう状態です.(他の総和も全て0になります) 何か間違いなどありますでしょうか? //hello2.cpp #define _COMPLEX_DEFINED #include <iostream> #include <string> #include "complex.h" #include "bessel.h" #include <math.h> #include <cmath> #include <stdio.h> #define RADIAN(ARC) ((ARC) * 3.14159 / 180) using namespace std; int main(void) { const double pi=3.141592654; const double I0=2829; const double r0=0; const double z=0; const double B1=6.07*pow(10,7); int k; double omega,freq,x; double R,Rk; double lambdag,ag; double lambda1,a1,l1; double lambda2,a2,l2; double p,p2,pg; double a11,a21,ag1,Rk1,l11,l21,p11,p21; double Km,Kn,Kg,am; complex r1,g,S2; complex sigma1,sigma2,sigmag; complex G,P,B,H; complex RR,NI,NI2,NI3,BE; double ANS,sumRIm,sumRRe,sumKm,sum; int x1; double r,r00,r001,r01; double imag(),real(); printf("接触熱抵抗"); scanf("%lf",&R); printf("加熱光半径(10^-6)×"); scanf("%lf",&Rk1); Rk=Rk1*pow(10,-6); printf("1層目熱伝導率"); scanf("%lf",&lambda1); printf("1層目温度伝導率(10^-6)×"); scanf("%lf",&a11); a1=a11*pow(10,-6); printf("1層目厚み(10^-6)×"); scanf("%lf",&l11); l1=l11*pow(10,-6); printf("2層目熱伝導率"); scanf("%lf",&lambda2); printf("2層目温度伝導率(10^-6)×"); scanf("%lf",&a21); a2=a21*pow(10,-6); printf("2層目厚み(10^-6)×"); scanf("%lf",&l21); l2=l21*pow(10,-6); printf("バッキング熱伝導率"); scanf("%lf",&lambdag); printf("バッキング温度伝導率(10^-6)×"); scanf("%lf",&ag1); ag=ag1*pow(10,-6); printf("1層目半径境界(10^-6)×"); scanf("%lf",&p11); p=p11*pow(10,-6); printf("2層目半径境界(10^-6)×"); scanf("%lf",&p21); p2=p21*pow(10,-6); printf("バッキング半径境界"); scanf("%lf",&pg); printf("am範囲"); scanf("%lf",&x1); x=2; freq=pow(10,x); omega=2*pi*freq; sum=0; sumRIm=0; sumRRe=0; sumKm=0; for (int i=1; i<=x1; i++) { sum+=i; am=(double)i; Km=am/p; Kn=am/p2; Kg=am/pg; sigma1=cpow(pow(Km,2)+complex(0,omega/a1),0.5); sigma2=cpow(pow(Kn,2)+complex(0,omega/a2),0.5); sigmag=cpow(pow(Kg,2)+complex(0,omega/ag),0.5); r1=B1/sigma1; g=(lambdag*sigmag)/(lambda1*sigma1); S2=(lambda2*sigma2)/(lambda1*sigma1); G = (1/(2*(S2+g)))*((S2-g)*(-1+R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(1+R*lambda2*sigma2+S2)); P = (1/(2*(S2+g)))*((S2-g)*(1-R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1-R*lambda2*sigma2+S2)); B = (1/(2*(S2+g)))*((S2-g)*((1-R*lambda2*sigma2)*r1+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1*(1+R*lambda2*sigma2)*r1+S2)); H = ((g+r1)*cexp(sigma1*l1)*G+(1-g)*cexp(-1*B1*l1)*B)/((1-g)*cexp(-1*sigma1*l1)*P+(1+g)*cexp(sigma1*l1)*G); r=0; r00=0; r001=1; r01=0.00005; BE=1; NI= exp(-1*(2*pow(r01,2)/pow(Rk,2)))*j0(Km*r)*r01; NI2=2*pi*r001*j0(Km*r00); NI3=cpow(j1(am),-2); RR= (B1*I0/(2*lambda1*(cpow(sigma1,2)-pow(B1,2))))*2*pow(p,-2)*cpow(BE,-2)*NI*(1/(1-g))*(-2*H+r1+1)*NI2*cexp(sigmag*z); sumKm+= Km; sumRIm+= RR.imag(); sumRRe+= RR.real(); } ANS=-atan((sumRIm/sumRRe)*(180/pi)); printf("%e\n",R*Rk); printf("%e\n",Rk); printf("%e\n",lambda1); printf("%e\n",B1); printf("%e\n",Km); printf("%e\n",sigmag); printf("%e\n",g); printf("%e\n",r1); printf("%e\n",j0(am)); printf("%e\n",G); printf("%e\n",P); printf("%e\n",B); printf("%e\n",H); printf("%e\n",NI3); printf("%e",RR.real()); printf("+"); printf("%e",RR.imag()); printf("i""\n"); printf("%e\n",sumKm); printf("%e\n",sumRRe); printf("%e\n",sum); printf("%e\n",ANS); scanf("%d",&k);// return 0; }

  • プログラムの作成

    Cで、キ-ボ-ドから整数を1個(mとする)、実数を1個(xとする)それぞれ入力し、 S=Σ(n=0からmまで)1/2n+1×(x-1/x+1)^2n+1 の値を求めるプログラムを作ってみたのですが、あってるかどうかわかりますか? #include<stdio.h> #include<math.h> main() { double y=0; int i,m,x; printf(\" Input m: \") scanf(\"%lf\", &m); printf(\" Input x: \") scanf(\"%lf\", &x); for(i=0; i <= m; i++) { y += 1/(2*i+1)*pow((x-1)/(x+1),2*i+1) } printf(\" S = %d\n\", y) }

  • C++総和の質問です

    Microsoft Visual Basic 6.0の質問です. 色々試してもうまくいかない箇所があるので質問させていただきます. この式の中で,am=1となっているものをam=1からam=x(xはscanfで入力) とし,最後のRRR上で1からxまでのRRRの総和を計算させることは可能でしょうか? 基本的な総和と違い,RRRより前に計算しているKmやKn上にそれぞれのamを代入し,最終的にRRRの総和を計算するという形にするやりかたがわからない状態です. プログラムが無駄に長くて申し訳ありませんが,わかる方いらっしゃいましたらよろしくお願いいたします. 以下プログラムです //hello2.cpp #define _COMPLEX_DEFINED #include <iostream> #include <string> #include "complex.h" #include "bessel.h" #include <math.h> #include <cmath> #include <stdio.h> #define RADIAN(ARC) ((ARC) * 3.14159 / 180) using namespace std; int main(void) { const double pi=3.141592654; const double I0=2829; const double r0=0; const double z=0; const double B1=6.07*pow(10,7); int k; double omega,freq,x; double R,Rk; double lambdag,ag; double lambda1,a1,l1; double lambda2,a2,l2; double p,p2,pg; double a11,a21,ag1,Rk1,l11,l21,p11,p21; double Km,Kn,Kg,am; complex r1,g,S2; complex sigma1,sigma2,sigmag; complex G,P,B,H; complex RR,NI,NI2,NI3,BE,RRR; double r,r00,r001,r01; double imag(),real(); printf("接触熱抵抗"); scanf("%lf",&R); printf("加熱光半径(10^-6)×"); scanf("%lf",&Rk1); Rk=Rk1*pow(10,-6); printf("1層目熱伝導率"); scanf("%lf",&lambda1); printf("1層目温度伝導率(10^-6)×"); scanf("%lf",&a11); a1=a11*pow(10,-6); printf("1層目厚み(10^-6)×"); scanf("%lf",&l11); l1=l11*pow(10,-6); printf("2層目熱伝導率"); scanf("%lf",&lambda2); printf("2層目温度伝導率(10^-6)×"); scanf("%lf",&a21); a2=a21*pow(10,-6); printf("2層目厚み(10^-6)×"); scanf("%lf",&l21); l2=l21*pow(10,-6); printf("バッキング熱伝導率"); scanf("%lf",&lambdag); printf("バッキング温度伝導率(10^-6)×"); scanf("%lf",&ag1); ag=ag1*pow(10,-6); printf("1層目半径境界(10^-6)×"); scanf("%lf",&p11); p=p11*pow(10,-6); printf("2層目半径境界(10^-6)×"); scanf("%lf",&p21); p2=p21*pow(10,-6); printf("バッキング半径境界"); scanf("%lf",&pg); x=2; freq=pow(10,x); omega=2*pi*freq; am=1; Km=am/p; Kn=am/p2; Kg=am/pg; sigma1=cpow(pow(Km,2)+complex(0,omega/a1),0.5); sigma2=cpow(pow(Kn,2)+complex(0,omega/a2),0.5); sigmag=cpow(pow(Kg,2)+complex(0,omega/ag),0.5); r1=B1/sigma1; g=(lambdag*sigmag)/(lambda1*sigma1); S2=(lambda2*sigma2)/(lambda1*sigma1); G = (1/(2*(S2+g)))*((S2-g)*(-1+R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(1+R*lambda2*sigma2+S2)); P = (1/(2*(S2+g)))*((S2-g)*(1-R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1-R*lambda2*sigma2+S2)); B = (1/(2*(S2+g)))*((S2-g)*((1-R*lambda2*sigma2)*r1+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1*(1+R*lambda2*sigma2)*r1+S2)); H = ((g+r1)*cexp(sigma1*l1)*G+(1-g)*cexp(-1*B1*l1)*B)/((1-g)*cexp(-1*sigma1*l1)*P+(1+g)*cexp(sigma1*l1)*G); r=0; r00=0; r001=1; r01=0.00005; BE=1; NI= exp(-1*(2*pow(r01,2)/pow(Rk,2)))*j0(Km*r)*r01; NI2=2*pi*r001*j0(Km*r00); NI3=cpow(j1(am),-2); RR= (B1*I0/(2*lambda1*(cpow(sigma1,2)-pow(B1,2))))*2*pow(p,-2)*cpow(BE,-2)*NI*(1/(1-g))*(-2*H+r1+1)*NI2*cexp(sigmag*z); RRR=-atan(((RR.imag())/(RR.real()))*(180/pi)); printf("%e\n",R*Rk); printf("%e\n",Rk); printf("%e\n",lambda1); printf("%e\n",B1); printf("%e\n",sigma1); printf("%e\n",sigmag); printf("%e\n",g); printf("%e\n",r1); printf("%e\n",j0(am)); printf("%e\n",G); printf("%e\n",P); printf("%e\n",B); printf("%e\n",H); printf("%e\n",NI3); printf("%e",RR.real()); printf("+"); printf("%e",RR.imag()); printf("i""\n"); printf("%e\n",RRR); scanf("%d",&k);// return 0; }

  • 定積分のプログラミングについて

    刻み幅dxを入力し、f(x)=4/(1+x^2)を0~1まで定積分するというプログラムを作ったんですが、なぜか、刻み幅を入力してENTERを押すと、 ずら~~~~~っと無限に結果の文字列が出てきてしまいます。 書いたプログラムを載せるので、間違っている箇所を教えてもらえませんか。お願いします。 #include <stdio.h> #include <math.h> double f(double m); main(){ double x,F,dx; printf("Numerical integration of y=4/(1+x^2).\n"); /*刻み幅の入力*/ scanf("%lf,&dx:"); /*aとbと刻み幅*/ printf("The lowwer bound:0.0\n"); printf("The upper bound:1.0\n"); printf("The meth width:dx\n"); /*関数*/ for(x=0.0;x<1.0;x+=dx) { F=f(x); /*計算結果を出力*/ printf(" f(%lf)= 4/(1+x^2) =%lf\n",x,F); } } double f(double m) { double y; y=4/(1+m*m); return y; }

  • newton法のjacobi

    以下のプログラムを作ったんですが実行したときに答えがnanになります。どなたか間違いがわかる方よろしくおねがします。 const double e =1e-10; enum {N=100}; const double x0 =1; const double y0 =1; double f(const double x,double y) {return x*x-y*y;} double g(const double x,double y) {return 6*x*y-5;} double dfdx(const double x,double y){return 2*x;} double dfdy(const double x,double y){return -2*y;} double dgdx(const double x,double y){return 6*y;} double dgdy(const double x,double y){return 6*x;} double det(double x,double y); main() { double x[N+1],y[N+1]; int i; double det2; x[0]=x0; y[0]=y0; for(i=0;i<=20;i++) { det2=det(x[i],y[i]); x[i+1]=x[i]-(dgdy(x[i],y[i])*f(x[i],y[i]))-(dfdy(x[i],y[i])*g(x[i],y[i]))/det2; y[i+1]=y[i]-(dgdx(x[i],y[i])*f(x[i],y[i]))-(dfdx(x[i],y[i])*g(x[i],y[i]))/det2; printf("x = %lf\n",x[i+1]); printf("y = %lf\n",y[i+1]); printf("\n"); } exit(0); } double det(double a,double b) { double ans; ans=1/(dfdx(a,b)*dgdy(a,b)-dfdy(a,b)*dgdx(a,b)); return ans; }

    • ベストアンサー
    • Java

専門家に質問してみよう