• 締切済み

初心者の作ったプログラムの問題点を指摘してください。

円周率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と表示されてしまいます。なぜ上手いこといかないのでしょうか? 問題点のご指摘をお願いいたします。

みんなの回答

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.2

× 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.…になります。

koko9i
質問者

お礼

実行してみたら即うまくいきました。 ありがとうございました。

  • zone29
  • ベストアンサー率53% (71/132)
回答No.1

最後の  S=4*S;  printf("%f",S); ここはその位置だと、最後100回目の結果しか表示できないですね。 whileのループ内に移しましょう。 while(n<100){  if(){   略  }else{   略  }  S=4*S;  printf("%d : %f\n", n, S); } 一応、結果を見やすくするため、 nの値の表示と改行もしておくべきでしょう。

koko9i
質問者

お礼

確かに近似がどのくらい正確か調べるには、大切なことですね。 ご指摘ありがとうございました。