• ベストアンサー

実行すると if文 に矛盾

#include <stdio.h> #include <math.h> int main(void) { /* */ double c, l, m, n, w=1, x[4]={1,2,3,4}, y[4]={1,2,3,4}; /* */ int j, k, u, v; /* */ for(j=0; j<3; j++){ /*   */ for(k=j+1; k<4; k++){ /*     */ l = sqrt( pow(x[j]-x[k], 2) + pow(y[j]-y[k], 2) ); /*     */ m = sqrt( pow(x[j], 2) + pow(y[j], 2) ); /*     */ n = sqrt( pow(x[k], 2) + pow(y[k], 2) ); /*     */ c = ( pow(m, 2) + pow(n, 2) - pow(l, 2) ) / (2*m*n); /*☆    */ /* if(c=w) ; */ /*※    */ if(c<=w){ /*       */ w = c; /*       */ u = j; /*       */ v = k; /*●    */ } else if(c>w){ /*       */ if(c=w) /*         */ printf("no way\n"); /*     */ } /*   */ } /* */ } /* */ printf("[ P%d P%d ]\n", u, v); /* */ return(0); } -------------------------------------------------------------------------------- 上記プログラムなのですが、Visual C++ でこれを実行すると、 ------------------------------ no way no way no way no way [ P0 P2 ] Press any key to continue ------------------------------ と出力されてしまいました。 ☆行のif文のコメントを外して直前で c=w を評価すると、※の部分が正常に処理されました。 なぜこのような矛盾が生じているのでしょうか? 何かご意見いただければ幸いです。 ※今回 Visual C++ でしか実行できるものがなかったため、他では確認できておりません。恐縮です。 ※この投稿の文字量の制限のため、プログラムの解説は割愛しました; ※補足などでお伝えできればよいのですが…。

  • quads
  • お礼率87% (87/99)

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

  • ベストアンサー
noname#96023
noname#96023
回答No.1

全文は見てませんが if(c=w) ; wをcに代入なので、次のifでマッチするのは当然です。 比較するなら==でしょう

quads
質問者

お礼

回答ありがとうございます。 みなさまに指摘いただきましたが、比較演算子を誤っていたため私が錯覚してしまいました。 お恥ずかしい限りです。

その他の回答 (2)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★回答者 #1 #2 さんと同じで printf("no way\n"); の上にある if(c=w) の部分が『矛盾』ってことだ。 ・比較演算子ならが if(c==w) となる。 ・代入演算子ならば if((c=w) != 0) としましょう。 ・それから if(c=w) ; の行は条件式が真になると、次のセミコロンを処理する。  このセミコロンだけの記述は『空文』という言い方があり、繰り返し文の中では使ったりする。 補足:『空文』の使用例 int StrLen( const char *string ) {  const char *p;    for ( p = string ; *p != '\0' ; p++ ){   ;←『空文』  }  return( p - string ); } 解説: ・上記のソースは、単純に文字列の長さを返す処理です。 ・本来、for文のブロックの中には何も記述しなくても良い。  でも、何もないと記述し忘れたと誤解される為に『空文』として  セミコロンだけを記述するちょっとした可読性のコツだよ! ・また、for文のブロックを記述しないときには、セミコロンだけの  『空文』を絶対に記述しないと次の return( p - string ); が  for文の繰り返し処理として実行されます。 最後に: ・☆の行の部分は if文と空文で1つの処理を正常に行うため、  ※の行に影響は全くでないため正常に処理されるのですよ。

quads
質問者

お礼

回答ありがとうございます。 みなさまに指摘いただきましたが、比較演算子を誤っていたため私が錯覚してしまいました。 錯覚したため、原因の追求に関して頓珍漢な考察をしてしまいました。 お恥ずかしい限りです。 空文については理解しておりますが前述の通りです。 説明いただき誠に恐縮です。 なお、皆様にご指摘いただき検証したところ、 元の if文 が理想通りに評価されていない原因が桁落ちによる誤差であると分かりました。 2乗根を取って2乗していたのですが、この値がずれていました。 比較する変数に格納する値に関して、式の変形をし、根号を含ませないよう対処いたしました。 扱えない桁数での四捨五入はしょうがないものの、大小関係の比較は正常に行なえました。 こちらで結果報告をさせていただきました。 失礼致します。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

if文の 比較演算子のつもりで使った=が 代入になっているのが原因かも 比較演算子は == しないといけません if ( c = w ) では wが0以外なら真となります if ( c == w ) なら c = wの場合真です # 実行結果と期待する結果ぐらいは書きましょうね...

quads
質問者

お礼

回答ありがとうございます。 みなさまに指摘いただきましたが、比較演算子を誤っていたため私が錯覚してしまいました。 期待する結果をプログラムの解説と併せて記述しようとしたら文字数制限に弾かれてしまいました。 示せず恐縮です。

関連するQ&A

  • 順列・数え上げ

    よろしくお願いします。 ここに下のような390個の文字があります。 (A,B,C,D,E,F,G,H,I,J,K,L,M がそれぞれ10個ずつ、 N,O,P,Q,R,S,T,U,V,W,X,Y,Z がそれぞれ20個ずつあります。) この390個の文字から235文字を選んで一列に並べる方法は全部で何通りありますか。 A B C D E F G H I J K L M A B C D E F G H I J K L M A B C D E F G H I J K L M A B C D E F G H I J K L M A B C D E F G H I J K L M A B C D E F G H I J K L M A B C D E F G H I J K L M A B C D E F G H I J K L M A B C D E F G H I J K L M A B C D E F G H I J K L M N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z N O P Q R S T U V W X Y Z 以下、私が考えたことを書きます。 この390個の文字から235個の文字を選ぶ組み合わせの総数は、 (Σ[k=0~10]x^k)^13*(Σ[k=0~20]x^k)^13 を展開したときのx^235の係数ですから、 23463540513956137996043929988 通りだということは分かります。 この23463540513956137996043929988 通りのそれぞれについて235個の文字 の順列(同種のものを含む順列)を数え上げれば答えは出ると思いますが、これは あまりにも大変な作業です。 何かよい知恵はないでしょうか。

  • このプログラムのエラーの原因を教えて下さいNo.1

    まずはじめに申しますが大変手間をとる回答になるのでそれでも協力してくれる方がいればの質問です・・・。 このプログラムを実行すると、Hdx3no2が宣言なしで使われているとエラーが出るのですが理由がわかりません。どこがおかしいのか教えてもらえると助かります。あまりにも長いので(コンパクトにできていないので)3回の質問に分けてしまいます・・・。そして非常に見にくくて済みません。 #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,uB,fai,sita,RAD,a,b,c; double Hdx3,Hdy3,Hdz3,Hdx3no1,Hdy3no1,Hdz3no1,Hdx3no2,Hdy3no2,Hdz3no2; double Hdx4,Hdy4,Hdz4,Hdx4no1,Hdy4no1,Hdz4no1,Hdx4no2,Hdy4no2,Hdz4no2; 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; THDX11=0; THDY11=0; THDZ11=0; THDX12=0; THDY12=0; THDZ12=0; THDX21=0; THDY21=0; THDZ21=0; THDX22=0; THDY22=0; THDZ22=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&&L!=0&&M!=0&&N!=-1||L!=0&&M!=0&&N!=0||L!=0&&M!=0&&N!=1){ 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\nAAA\n",L,M,N,r); } else if(L==0&&M==0&&N==-1||L==0&&M==0&&N==0||L==0&&M==0&&N==1){ Hdx3no1=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy3no1=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz3no1=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); } else{ continue; } } } } //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-Px1; Y=y-Py1; Z=z-Pz1; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R&&L!=-1&&M!=0&&N!=-1||L!=-1&&M!=0&&N!=0||L!=-1&&M!=0&&N!=1){ if(L!=0&&M!=0&&N!=-1||L!=0&&M!=0&&N!=0||L!=0&&M!=0&&N!=1){ 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)); THDX12=THDX12+Hdx; THDY12=THDY12+Hdy; THDZ12=THDZ12+Hdz; printf("L=%d M=%d N=%d R=%lf\nBBB\n",L,M,N,r); } } else if(L==-1&&M==0&&N==-1||L==-1&&M==0&&N==0||L==-1&&M==0&&N==1){ if(L==0&&M==0&&N==-1||L==0&&M==0&&N==0||L==0&&M==0&&N==1){ Hdx3no2=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy3no2=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz3no2=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } } else{ continue; } } } } これをNo.1として続きのプログラムをNo.2に挙げます。

  • fortranのif文で・・・

    フォートランの if文で IF(M-1) 15,15,12 ってのがあるんですが,これはどういう意味を表しているのでしょうか ? IF(R.LE.0.D0) THEN ・・・・ ならRが0より小さいときは・・・・しなさい.って命令ですよね. でもうえのは,カッコの中がいったいどういうときならってのを表してるのかも分からないし,15,15,12 ってのも意味がわかりません. 基本的なことかもしれませんが,よろしくお願いします. 一応その部分のプログラムも載せておきます. X(N+1)=X(1) Y(N+1)=Y(1) DO 10 I=1,N XM(I)=(X(I)+X(I+1))/2 10 YM(I)=(Y(I)+Y(I+1))/2 IF(M-1)15,15,12 12 XM(NC(1))=(X(NC(1))+X(1))/2 YM(NC(1))=(Y(NC(1))+Y(1))/2 DO 13 K=2,M XM(NC(K))=(X(NC(K))+X(NC(K-1)+1))/2 13 YM(NC(K))=(Y(NC(K))+Y(NC(K-1)+1))/2 15 CONTINUE

  • バネ・マス・ダンパを含む2階微分方程式の解

    以下の2階の微分方程式の解xを求めようとしています。 mx'' + cx' + kx = u m:マスの質量 c:ダンパ定数 k:ばね定数 u:ステップ入力 k >> c という条件があるとき、 pole1 = -c/2m + j ( sqrt(4mk - c^2) / 2m ) pole2 = -c/2m - j ( sqrt(4mk - c^2) / 2m ) より解xは、 x = u/k + Y e^λt Sin(ωt + θ) ただし λ = -c/2m ω = sqrt(4mk - c^2) / 2m Y,θは初期値から求める。 解xはこのような導出方法でよろしいでしょうか?

  • このプログラムの実行結果についてお助け下さい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); 以上です・・・。

  • 1/sqrt(x^2+y^2) の x^j y^k

    二次元波動関数の運動を近似計算するために 1/r ≡ 1/sqrt(x^2+y^2) を x^j y^k 整数 べき乗の和として近似しようとしています。より具体的には、下のような近似を成り立 たせる係数 c[j,k] を旨く決めたいと思っています。ただし j,k ∈[-N,N] の整数で す。 N は 2 か 3 か 4 です。             N   N 1/sqrt(x^2+y^2) ≒ Σ  Σ   c[j,k] x^j y^k             j=-N k=-N 皆様でしたら、この c[j,k] をどのように定めますでしょうか。

  • このプログラムの実行結果についてお助け下さい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); 以上です・・・。

  • このプログラムの実行結果についてお助け下さい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に載せます。

  • c言語

    c言語で写真の課題を出されたのですが自分のプログラムでは上手くいきません。どこが間違っているのか教えて欲しいです。 自分のプログラム #include<stdio.h> #include<math.h> int main(){ int i,j; double c,d,x,y,z; for(i=0;i<=360;i++){ c=10*cos(i*M_PI/180); d=10*sin(i*M_PI/180); if(c>=0 && d>=0){ for(j=0;j<=1000;j++){ x=0.001*j; y =x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } if(c<=0 && d>=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c<=0 && d<=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c>=0 && d<=0){ for(j=0;j<=1000;j++){ x=0.001*j; y=x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } printf("x=%lf y=%lf z=%lf\n",x,y,z); } return(0); }

  • Cプログラムが円ではなく楕円になってしまう

    円を描くCプログラムを書きたいのですが、 楕円形になってしまいます。どこが間違っていますか。 御教示ください。 main () { int x,y1,y2; double pow(), d ; openwindow(100,100,"02kc951:1-3",3); setfgcolorbyRGB(255,255,255); for(x=0;x<100;x++) { d = pow(-100.0,2.0)-(4*pow(50.0,2.0)-pow(40.0,2.0)+pow(x-50.0,2.0)); /* 判別式 */ if( d>=0 ) { y1=(100-sqrt(d))/2.0; /* y1を求める*/ y2=(100+sqrt(d))/2.0; /* y2を求める*/ setpixel(x,y1); setpixel(x,y2); } } closewindow(); }