- 締切済み
初心者の作ったプログラムの問題点を指摘してください。
円周率Sを S=4*Σ(-1)^n/(2n+1){(1/2)^(2n+1)+(1/3)^(2n+1)} 但しnは1から100まで をつかって求めるプログラムをwhile文とif文をつかって作る というのが目的で、 #include<stdio.h> int main(void){ int n=0; double a=0.5,b=0.3333333333333,S=a+b; while(n<100){ { if(n %2==0){ /*n is even*/ n=n+1; a=a*1/4; b=b*1/9; S=S-1/(2*n+1)*(a+b);} else{ /*n is odd*/ n=n+1; a=a*1/4; b=b*1/9; S=S+1/(2*n+1)*(a+b);} } }S=4*S; printf("%f",S); return 0; } こう組んでみたのですが、どうもwhile文が無視されてしまうらしく 3.333333と表示されてしまいます。なぜ上手いこといかないのでしょうか? 問題点のご指摘をお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- buriburi3
- ベストアンサー率44% (353/792)
× S=S-1/(2*n+1)*(a+b); ○ S=S-1./(2*n+1)*(a+b); 1/(2*n+1)と書くと整数演算が行われ結果が0になる。 1./(2*n+1)と書けば実数演算が行われ結果が0.…になります。
- zone29
- ベストアンサー率53% (71/132)
最後の S=4*S; printf("%f",S); ここはその位置だと、最後100回目の結果しか表示できないですね。 whileのループ内に移しましょう。 while(n<100){ if(){ 略 }else{ 略 } S=4*S; printf("%d : %f\n", n, S); } 一応、結果を見やすくするため、 nの値の表示と改行もしておくべきでしょう。
お礼
確かに近似がどのくらい正確か調べるには、大切なことですね。 ご指摘ありがとうございました。
お礼
実行してみたら即うまくいきました。 ありがとうございました。