• 締切済み

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

まずはじめに申しますが大変手間をとる回答になるのでそれでも協力してくれる方がいればの質問です・・・。 このプログラムを実行すると、upperのU1、U2と、lowerのU1、U2の結果において、最後のelseの中のプログラムが実行されていないせいで、「ここまでが~」が表示されるだけになり、「抜き出した~」の前の実行結果が初期値通り0になってしまっています。何故どれも最後のelse文が実行されないのか・・・お教え頂けると助かります。あまりにも長いので(コンパクトにできていないので)2回の質問に分けてしまいます・・・。そして非常に見にくくて済みません #include<stdio.h> #include<math.h> int main(void) { int L,M,N,A,B,C; double U1,U2,x,y,z,X,Y,Z,r,ux1,uy1,uz1,ux2,uy2,uz2,Hdx,Hdy,Hdz; double Hdx1,Hdy1,Hdz1,Hdx2,Hdy2,Hdz2,Hdip1,Hdip2,Hdip3,Hdip4,Hdip5,Hdip6,uB,fai,sita,RAD,a,b,c; double Hdx3,Hdy3,Hdz3,Hdx4,Hdy4,Hdz4,Hdx5,Hdy5,Hdz5; double Hdx6,Hdy6,Hdz6,Hdx7,Hdy7,Hdz7,Hdx8,Hdy8,Hdz8; double Hdx9,Hdy9,Hdz9,Hdx10,Hdy10,Hdz10,Hdx11,Hdy11,Hdz11; double Hdx12,Hdy12,Hdz12,Hdx13,Hdy13,Hdz13,Hdx14,Hdy14,Hdz14; double Hdx15,Hdy15,Hdz15,Hdx16,Hdy16,Hdz16,Hdx17,Hdy17,Hdz17; double Hdx18,Hdy18,Hdz18,Hdx19,Hdy19,Hdz19,Hdx20,Hdy20,Hdz20; double Hdx21,Hdy21,Hdz21,Hdx22,Hdy22,Hdz22; double Px1,Py1,Pz1,Px2,Py2,Pz2,THDX11,THDY11,THDZ11; double THDX12,THDY12,THDZ12,THDX21,THDY21,THDZ21; double THDX22,THDY22,THDZ22,R,gamma,Beta,CPA,CPB,CPC,upper,lower; uB=9.274; U1=3.41*uB; U2=-U1; RAD=3.14159265358979/180; a=7.256; b=8.575; c=3.544; Beta=7.55*RAD; CPA=0.0604; CPB=0.3; CPC=0.156; //プロトンの位置 Px1=CPA*a*cos(Beta); Py1=CPB*b; Pz1=CPC*c-CPA*a*sin(Beta); Px2=-Px1; Py2=Py1; Pz2=-Pz1; sita=90*RAD; fai=90*RAD; Hdx5=0; Hdy5=0; Hdz5=0; Hdx6=0; Hdy6=0; Hdz6=0; Hdx7=0; Hdy7=0; Hdz7=0; Hdx8=0; Hdy8=0; Hdz8=0; Hdx9=0; Hdy9=0; Hdz9=0; Hdx15=0; Hdy15=0; Hdz15=0; Hdx16=0; Hdy16=0; Hdz16=0; Hdx17=0; Hdy17=0; Hdz17=0; Hdx18=0; Hdy18=0; Hdz18=0; Hdx19=0; Hdy19=0; Hdz19=0; THDX11=0; THDY11=0; THDZ11=0; THDX12=0; THDY12=0; THDZ12=0; Hdx4=0; Hdy4=0; Hdz4=0; Hdx10=0; Hdy10=0; Hdz10=0; THDX21=0; THDY21=0; THDZ21=0; THDX22=0; THDY22=0; THDZ22=0; Hdx14=0; Hdy14=0; Hdz14=0; Hdx20=0; Hdy20=0; Hdz20=0; R=6; gamma=4.25775; A=(R/a)+1; B=(R/b)+1; C=(R/c)+1; ux1=U1*sin(sita)*cos(fai); uy1=U1*sin(sita)*sin(fai); uz1=U1*cos(sita); ux2=U2*sin(sita)*cos(fai); uy2=U2*sin(sita)*sin(fai); uz2=U2*cos(sita); //upper //U1のとき for(L=-A;L<=A;L++) { for(M=-B;M<=B;M++) { for(N=-C;N<=C;N++) { x=L*a*cos(Beta); y=M*b; z=N*c-L*a*sin(Beta); X=x-Px1; Y=y-Py1; Z=z-Pz1; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R){ if(L==0&&M==0&&N==0){ Hdx1=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy1=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz1=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); } else if(L==0&&M==0&&N==1){ Hdx2=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy2=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz2=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); } else if(L==0&&M==0&&N==-1){ Hdx3=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy3=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz3=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); } else{ Hdx=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); THDX11=THDX11+Hdx; THDY11=THDY11+Hdy; THDZ11=THDZ11+Hdz; printf("L=%d M=%d N=%d R=%lf\n",L,M,N,r); } } } } } Hdx4=Hdx1+Hdx2+Hdx3; Hdy4=Hdy1+Hdy2+Hdy3; Hdz4=Hdz1+Hdz2+Hdz3; printf("ここまでがupperのU1の時のL,M,N、それぞれの値\n"); 続きを2に載せます。

みんなの回答

  • f272
  • ベストアンサー率46% (8467/18126)
回答No.1

> 何故どれも最後のelse文が実行されないのか それはそのようにプログラムされているから。 for (L = -A; L <= A; L++){for (M = -B; M <= B; M++){for (N = -C; N <= C; N++){ の3重ループで合計45回回るようだけど,そのうち if (r < R){ を満たすのは L == -1 && M == 0 && N == -1 L == -1 && M == 0 && N == 0 L == -1 && M == 0 && N == 1 L == 0 && M == 0 && N == -1 L == 0 && M == 0 && N == 0 L == 0 && M == 0 && N == 1 の場合しかないのだからelseにはひっかからない。

scottish1246
質問者

お礼

もう一度実行してみるとTHD〇12とTHD〇22のみ値が出て、THD〇11とTHD〇21が0になりました。12と22の値のみでその後のHd〇やHdip、upper、lowerの値が出てしまい、結果的に低くなってしまいました。Rを6から10へ変えてみました。すると11も21も出ました。しかしHdipやupper、lowerは値が変化しませんでした。おそらく間違った数値になりました。 Rの範囲を広げた所でelseにおいてのループでやはりひっかかっていない計算があるようです・・・。 解決には至りませんでしたが回答有難うございます。

関連するQ&A