• 締切済み

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

円周率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/133)
回答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
質問者

お礼

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

関連するQ&A

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

    下のように、0から9までの乱数の発生回数の標準偏差を求めるプログラムを組んでみたのですが、最後のシグマの演算が無視されてしまい、0.000000と出力されてしまいます。どこがいけないのでしょうか? #include<stdio.h> #include<time.h> #include<stdlib.h> #include<math.h> int main (void){ int N,i,j,r,a[10]={0,0,0,0,0,0,0,0,0,0}; double S=0; printf("How many trials?;"); scanf("%d",&N); srand((unsigned)time(NULL)); /*初期化*/ for(i=0;i<N;i=i+1) { r=(int)(rand()/(RAND_MAX +1.0)*10); /*乱数N個取得*/ a[r]=a[r]+1; } for(r=0;r<10;r=r+1){ printf("a[%d]=%d.\n",r,a[r]); S=1/10*(S+sqrt((a[r]-N/10)*(a[r]-N/10)));  /*演算(無視されてしまう・・・)*/ } printf("Sigma=%f",&S); return 0; }

  • プログラムが始まりません

    以下のプログラムを書いたところ、コンパイルは出来たのですが 正しく動作するか動かしたところ、7行目のprintfも実行されませんでした。それより上の部分に不備があるのでしょうか。 何か基本的なことをなにか基本的なことを理解できてないのかもしれませんが、教えていただけませんでしょうか #include<stdio.h> int main(void) { FILE *fi; char fname[100], ss[255], *a, t, ch; int count, b, n, err, c[1000]; printf("file name?"); gets(fname); fi = fopen(fname,"r"); fgets(ss,255,fi); if(ss[0]!='P') err = 1; if(ss[1]!='3') err = 1; if(err ==1){ printf("file type is wrong\n"); exit(1); } while(count < 3){ *a = fgetc(fi); if(*a == 20){ count++; } } while(1){ *a = fgetc(fi); if(*a == EOF){ break; } if(*a == 20){ b++; } if(b == 3){ b = 0; t = *(a-1); if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[n] = 1; } else{ c[n] = 2; } n++; } ++a; } n == 0; while(c[n] !=0){ count == 0; while(count < 8){ if(c[n] == 1){ ch++; } ch == ch + ch; count++; } printf("%c",ch); } fclose(fi); }

  • このプログラムの問題点を教えてください。

    いつもお世話になっております。 また質問させていただきます。 あるサイトの課題を自分なりにやってみました。 問題文 クイズを3題出題し、ユーザの解答に応える(「正解」とか「不正解」とか言う)プログラムを書いてください。   クイズは何でもかまいません。 それで作ってみたプログラムがこれです。 #include <stdio.h> int main(void){ int x,y; printf("1234\n"); scanf("%d",&x); switch(x){ case 0: return 0; case1: printf("hgfhgfhsa\n"); break; case2: printf("hjtuyer\n"); break; case3: printf("uytcbbvxbn\n"); break; case4: printf("oiu68fgfd\n"); break; } while(1){ printf("haydhgfsjd?\n"); printf("1,kukakaka 2,hihihi 3,yayay\n"); scanf("%d",&y); if(y == 1){ printf("763827648327ue\n"); break; } else if(y == 2){ printf("menndokusai\n"); break; } なんとかコンパイルができました。本当は3問問題を書かなければいけないのですが2問目が終わって確認の意味でコンパイルしました。 それで実行してみたところ、1問目の答えが出ませんでした。自分でも理由がわかりません。 なので皆様に問題点を指摘してほしいのです。 へんな質問ですがよろしくおねがいします。

  • Cプログラムの条件文  if,else if ,elseについて教えてください。

     こんにちは。課題でどうしても解らないところがあるので教えてください。  次のプログラムは一桁の数(0~9)が偶数(EVEN)か奇数(ODD)かを表示するものです。  #include <stdio.h> main() { int num; printf("please enter a number[0~9]:"); scanf("%d",&num); if (num % 2 ==0) printf("%d is an EVEN. \n", num); else printf("%d is an ODD. \n", num); } というプログラムをコンパイルして実行すると、ちゃんと実行されるのですが、10以上の数や負数を入力しても動作してしまうんです。  そこで0~9の範囲以外の数が入力されていないかを確認して、その場合を偶数、奇数の判断や表示をせず、エラーメッセージだけを表示して終了するプログラムに書き換えなくてはならないのですが、まず  (1)判断する条件式(変数numの内容が0~9の範囲にあるか)で、num >= 0 && num <= 9 をどこに入れればいいか。  (2)please enter a number[0~9]: 8 8 is an EVEN.  (←例えば8を入れると普通こうなるのですが)   please enter a number[0~9]:12   ERROR:12 is in out of range!!  (←0~9以外ののものだったら、この様にエラー表示にしたいのです。  私が考えたプログラムは  #include <stdio.h> main() { int num; printf("please enter a number[0~9]:"); scanf("%d",&num); if (num % 2 ==0) printf("%d is an EVEN. \n", num); if else printf("%d is an ODD. \n", num); else(num >= 0 && num <= 9) printf("ERROR:%d is in out of range!! \n",num); } という風に考えたのですがコンパイルできません。プログラミング初心者なので、書いている内容も解りにくいんですが、どうかよろしくお願いします。

  • 長方形、円、三角形の計算するプログラムでエラーがでます

    タイトルの通りなんですがエラーがでます>< コンパイラはできたのですが、実行して二つ目の入力するとこで、入力したあと止まります。 どこがおかしいのでしょうか? #include <stdio.h> int sikaku(void); int en(void); int main(void) { char ch; int a,b; printf("円(A) 長方形(B) 三角形(C)\n"); printf("入力してください:"); ch = getche(); if(ch == 'C'){ printf("\n底辺を入力してください:"); scanf("%d ",a); printf("高さを入力してください:\n"); scanf("%d",b); printf("%dです",a * b); } else if(ch == 'B') sikaku(); else if(ch == 'A') en(); return 0; } int en(void) { int a; float f; printf("\n半径を入力してください:"); scanf("%d",a); printf("円周率を入力してください:"); scanf("%f",f); printf("%fです",a * a * f); return 0; } int sikaku(void) { int a,b; printf("\n縦を入力してください:"); scanf("%d",a); printf("横を入力してくさい:\n"); scanf("%d",b); printf("dです",a * b); return 0; }

  • このプログラムの復元処理教えでください。助けてくだ

    #include <stdio.h> int main(void) { char a[51]; char b[101]; char c[51]; int i,k; int cnt; printf("文字例-->"); scanf("%s",a); i = 0; k = 0; while(a[i] !='\0') { cnt = 0; b[k] = a[i]; while(b[k] = a[i]) { cnt++; i++; } k++; b[k] = cnt + 48; k++; } b[k]='\0'; printf("b=%s\n",b); printf("c=%s\n",c); //-------------------------------------------------- getchar(); return 0; }

  • 間違いが理解できない!!

    下に投稿を行ったばかりですが 質問させてください。 #include<stdio.h> int main(void) { int a; a=3 if(a==a/2*2){ printf("%d is EVEN \n",a); }else{ printf("%d is ODD \n",a); }return(0);} 課題文 「上記のプログラムを改造して、 aが正の場合はPLUSを、 aが負の場合はMINUSを、 aがゼロの場合はZEROを 表示するプログラムを作成し、 実行しよう。」 とあったので、私は #include<stdio.h> int main(void){ int a; printf("変数aに数字を入力してください\n"); printf("a="); scanf("%d",&a); if(a>0){ printf("%d is plus\n",a); }else if(a==0){ printf("%d is zero\n",a); }else{ printf("%d is minus\n",a); } return(0); } と作成しました。 しかし、評価はFAIRでした。(PASS,FAIR,RETRYがあり、 FAIRは「課題を取り違えているがOK.ただし満点じゃない」です) なぜかと言うと、習っていないscanfを使ったかららしく、 課題と違うからだそうです。 習っていないものを使ってはいけないなど聞いてもいませんし、 (私はC言語の知識がある程度あったのでscanfを使いました) 納得いきません。 もし、課題文が、 「上記のプログラムの if文以下を改造して・・・」 となっていたら、私のプログラムは間違いです。 しかし、改造してとしか書いてなかったので、 間違いではないと思います。 皆さんはどうおもいますか?

  • C初心者です。どうかお助けを

    独習Cという本で独学中なのですが #include<stdio.h> int main() { int a,b; char ch; printf("実行したい演算は\n"); printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか\n"); do{ printf("アルファベットの1文字を入力してください:"); ch=getchar(); while(getchar()!='\n'); }while(ch!='A' && ch!='S' && ch!='M' && ch!='D'); printf("\n"); printf("最初の数字を入力してください:"); scanf("%d",&a); printf("二つめの数字を入力してください:"); scanf("%d",&b); switch(ch){ case 'A': printf("%d",a+b); break; case 'B': printf("%d",a-b); break; case 'C': printf("%d",a*b); break; case 'D': if(b!=0)printf("%d",a/b); } return 0; } このプログラムでの14行目の while(getchar()!='\n');の必要性がわかりません。 どなたか有識者の方の回答をお願いします。

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

  • プログラム(初心者)

    文字列を入力し中に含まれる空白を削除した文字列を作るプログラムなのですが #include <stdio.h> #include <stdlib.h> int main(void){ char str[100]; int i,j,c; printf("文字列を入力してください\n"); gets(str); i=j=0; do{ c=str[i++]; if(c!= ' ') str[j++]=c; }while(c); printf("空白を削除した文字列は%sです\n",str); return EXIT_SUCCESS; } do文の所何やってるかさっぱりわかりません 教えてください

専門家に質問してみよう