• 締切済み

教えていただいたのですが…

以前ここで質問して教えていただいたのですが、私の持っている本とプログラムが違っていました。 で、本のとおりにプログラムを書いてもうまく実行できません。 私が書いたのを下に載せるので、間違っているところを教えてください。 プログラムは、『nとn個のデータを入力して平均を求める』というものです。 あと、これに合計と標準偏差を計算して出力するプログラムも加えて教えていただけるとうれしいです。 #include<stdio.h> #define NMAX 1000 main() { double x[NMAX],sum=0.0,average; int i,n; printf("Input the number of DATA"); scanf("%d",&n); for (i=0; i<n; i++) { printf("Input %d-th DATA;",i+1); scanf("%lf",&(x[i])); } for(i=0; i<n; i++); { sum+=x[i]; } average=sum/n; printf("Average=%lf\n",average); } 何度もすいません…

みんなの回答

noname#2009
noname#2009
回答No.3

QNo.300464 でも書きましたが・・・ そっからの修正だと、 -------------------------------------------- #include<stdio.h> #include <math.h> // sqrt( ), fabs( ) で必要  ※(2) #define NMAX 1000 main() { double sumsq = 0.0; // 平方和 ※(2) double hensa; // 標準偏差 ※(2) double x[NMAX],sum=0.0,average; int i,n; printf("Input the number of DATA"); scanf("%d",&n); for (i=0; i<n; i++) { printf("Input %d-th DATA;",i+1); scanf("%lf",&(x[i])); // printf("%lf\n", x[i]);h } //修正 for(i=0; i<n; i++); for(i=0; i<n; i++) { sum+=x[i]; sumsq = sumsq + x[i] * x[i]; // 平方和を求める ※(2) } average=sum/n; printf("Average=%lf\n",average); // 標準偏差を求めて表示 ※(2) hensa = sqrt(fabs(sumsq /n - average * average)); printf ("標準偏差 = %lf\n", hensa); // 合計を表示 ※(2) printf ("合計 = %d\n", sum); } -------------------------------------------- ・修正個所は「// 修正」の部分 ・(2)の課題分の追加は「※(2)」のある行です。 理由は「GOLDEN」さんと「wolv」さんがなさっている 適格な解説の通りです。本に違うことが書かれていても 助言者のアドバイスの方が生きた声ですので。。。 課題大変だね

参考URL:
http://www.okweb.ne.jp/kotaeru.php3?q=300464
全文を見る
すると、全ての回答が全文表示されます。
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.2

変動S、分散V、標準偏差s は、それぞれ、 S = Σ (x[i] - average)^2 V = S/(n-1) s = √V なので、標準偏差を定義どおりに計算するなら、 float S=0.0,V,s; を宣言しておき、平均を計算したあとの部分で、 for(i=0;i<n;i++)S+=(x[i]-average)^2; V=S/(n-1); s=sqrt(V); として計算し、printfなどで結果を表示すればいいでしょう。 数学関数であるsqrtを使うためには、ソースの冒頭に#include<math.h>を付け加え、コンパイル時に -lm を追加する必要があったかもしれません。 例:  cc -o my_program my_program -lm

全文を見る
すると、全ての回答が全文表示されます。
  • GOLDEN
  • ベストアンサー率46% (283/607)
回答No.1

2回目のfor文の最後にセミコロン(;)が付いているため、forを抜けた時点でiがnに なってしまっているため、不定な値を参照し、それを平均しているので、データが おかしくなるんじゃないですか? 合計は、既に変数sumの中に求まっていますから、それを表示すればOKでしょう printf("Sum=%lf\n",sum); 標準偏差は、どうやって求めるのかが解らないので、答えられません

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 多重配列に関して

    以下のプログラムについての質問です。 10行目 for i = 0 の時、13行目 for j = 0 で scanf("%lf", &a[0][0])に10と代入します。 この時のドス画面は input 1-th line element:10 です。ここまではいいのですが、この次がよくわかりません。私の考えでは、10行目 i = 0 の時 13行目 j = 1 となって j がNMAXまでやったら、10行目のiが1になってまた同じように動いて、10行目の i がNMAXになったら、for文が終わると考えたのですが、このプログラムの実行結果(一番下にあります)を見てみると自分の考えが間違っていることに気がつきました。 3行3列のプログラムなので、a[0][0] a[0][1] a[0][2] a[1][0].......となると考え、scanfでドス画面に9回数字を打ち込むかと思ったのですが実際は3回でした。このプログラムはどのように読んだら良いのでしょうか?? 回答宜しくお願い致します。 1  #include <stdio.h> 2  #define NMAX 3 3 4  main() 5  { 6   double a[NMAX] [NMAX], b[NMAX] [NMAX], c[NMAX] [NMAX]; 7   int i,j,k; 8 9   printf("matrix 1:\n"); 10   for(i=0; i< NMAX; i++) 11   { 12   printf("input %d-th line element:", i+1); 13   for(j=0; j< NMAX; j++); 14   { 15   scanf("%lf", &a[i][j]); 16   } 17   } 18   printf("matrix 2:\n"); 19   for(i=0; i<NMAX; i++) 20   { 21   printf("input %d-th line element:", i+1); 22   for(j=0; j< NMAX; j++); 23   { 24   scanf("%lf", &b[i] [j]); 25   } 26   } 27  for(i=0; i<NMAX; i++) 28   { 29   for(j=0; j<NMAX; j++) 30   { 31   c[i][j] = 0; 32   for(k=0; k <NMAX; k++) 33   { 34   c[i][j] += a[i][k] * b[k][j]; 35   } 36   } 37   } 38 39  printf("matrix 1 * matrix2 = :\n"); 40  for(i=0; i<NMAX; i++) 41   { 42   printf("["); 43   for(j=0;j<NMAX; j++) 44   { 45   printf("%f", c[i][j]); 46   } 47   printf("]\n"); 48   } 49  }

  • 質問ですが

    教えていただきたいのですが、C言語で名前と点数を入力して合計と平均を求めるというプログラムを作ったのですが、 main関数の中で情報入力、合計と平均の計算をしているのでそれぞれ入力関数、合計を求める関数、平均を求める関数というものを作ってmain関数をすっきりとさせたいのですがどうすればいいですか? #include <stdio.h> typedef struct{ char name[15]; int jpn; int eng; int math; int sum; } stdent; typedef struct{ double sum; double jpn; double eng; double math; } Score; void maxmin(stdent *, int); main() { int i, n; n = 5; stdent person[n]; Score average; average.jpn = 0; average.eng = 0; average.math = 0; average.sum = 0; for(i = 0; i < n; i++) { printf("Student No.%d \n",i + 1); printf("Name? "); scanf("%s", person[i].name); printf("Japanese? "); scanf("%d", &(person[i].jpn)); printf("English? "); scanf("%d", &(person[i].eng)); printf("Math? "); scanf("%d", &(person[i].math)); printf("\n"); person[i].sum = person[i].jpn + person[i].eng + person[i].math; average.jpn += person[i].jpn; average.eng += person[i].eng; average.math += person[i].math; average.sum += person[i].sum; } average.jpn /= n; average.eng /= n; average.math /= n; average.sum /= n; printf(" 名前 国語 英語 数学 \n"); printf("------------------------------------\n"); for(i = 0; i < n; i++) { printf("%8s %3d %3d %3d %3d\n", person[i].name, person[i].jpn, person[i].eng, person[i].math, person[i].sum); } printf("------------------------------------\n"); printf("平均 %.1lf %.1lf %.1lf %.1lf\n\n", average.jpn,average.eng,average.math,average.sum); return 0; }

  • Cプログラミング

    #include <stdio.h> main(){ int i; int n; double data[100]; double total; double average; printf ("# of data ="); scanf ("%d" , &n); for (i = 0; i < n; i++){ printf("data[%d] = ", i+1); scanf("%lf" , &data[i]); } total = 0; for (i = 0; i < n; i++){ total = total +data[i]; } average = total / n; printf("total = %g\n", average); for (i = 0; i < n; i++){ printf("data[%d] : %6.1f %%\n" , i+1, (data[i] - average) / average * 100.0); } } 上のプログラムに対し、増加率の代わりに標準偏差を計算し出力するように改造せよ。という課題が出たのですが、標準偏差の計算の仕方が分かりません。教えてください。 よろしくお願いします。

  • プログラムの作成

    Cで、キ-ボ-ドから整数を1個(mとする)、実数を1個(xとする)それぞれ入力し、 S=Σ(n=0からmまで)1/2n+1×(x-1/x+1)^2n+1 の値を求めるプログラムを作ってみたのですが、あってるかどうかわかりますか? #include<stdio.h> #include<math.h> main() { double y=0; int i,m,x; printf(\" Input m: \") scanf(\"%lf\", &m); printf(\" Input x: \") scanf(\"%lf\", &x); for(i=0; i <= m; i++) { y += 1/(2*i+1)*pow((x-1)/(x+1),2*i+1) } printf(\" S = %d\n\", y) }

  • このプログラムを改良して…

    #include<stdio.h> #define NMAX 200 int n; int a[NMAX], x[NMAX]; void yomikomi() { for(n=0; scanf("%d %d",&a[n],&x[n])!=0;n++); return; } void hyouzi() { int i; for(i=0;i<n;i++) printf("%5d %5d\n",a[i],x[i]); return; } void seiretu() { int i,j,max,k,w; for(i=0;i<n-1;i++){ max=x[i];k=i; for(j=i+1;j<n;j++) if(x[j]>max){ max=x[j];k=j; } w=a[k];a[k]=a[i];a[i]=w; x[k]=x[i]; x[i]=max; } return; } main() { printf("Sorting\n"); yomikomi(); printf("\nInput data\n"); hyouzi(); seiretu(); printf("\nSorted data\n"); hyouzi(); return(0); } 以上のプログラムは、 Sorting 1 87 2 91 3 76 4 84 5 61 6 100 7 93 \n\n と入力しますと、 Input data 1 87 2 91 3 76 4 84 5 61 6 100 7 93 Sorted data 6 100 7 93 2 91 1 87 4 84 3 76 5 61 Press any key to continue という結果(左が番号として右が点数とした場合、点数が上位のものから番号を並びかえる)が出るプログラムです。このプログラムを改良して、上の結果を例として、 Input data 1 87 2 91 3 76 4 84 5 61 6 100 7 93 Guusuu   3 76 4 84 6 100 Kisuu 2 91 3 76 5 61 7 93 という風に右側の数が偶数か奇数かでわけて結果を出すことは可能でしょうか?可能であれば教えてください。お願いします。

  • わかる人 フローチャート

    このプログラムをフローチャートに直しなさい void main() { int i, n; int sum = 0; printf("n?\n"); scanf("%d",&n); for (i=0; i<=10; i++) { sum = sum + i; } printf("sum = %d\n",sum); }

  • C++に関する質問です

    #include <stdio.h> double calave (double [ ] ); double calmax (double [ ] ); main () { int i; double average,maximum; double a[5]; for ( i=0;i<=4;i++) { printf ("Input data %d\n", i ); scanf ("%lf",&a [i] ); } average = calave (a); maximum = calmax (a); printf ("Average = %lf\n", average); printf (" Maximum = %lf\n", maximum); } double calave (double x [5]) { int i; double ave; ave = 0; for (i=0; i<=4; i++) { ave = ave + x[i]; } ave = ave /5.0; return (ave); } double calmax (double x[5]) { int i; double max; max = x[0]; for ( i=0; i<=4; i++) { if ( max >= x [i] ){ max = max; }else{ max = x[i]; } } return (max); } 上のプログラムでは,関数calaveに入力している配列変数はa[ ]だが,関数calave内で使用している配列変数はx[ ]であり,名前が違う変数である。これが,プログラム上は問題ない理由を教えてください。 よろしくお願いします。

  • すいません。。改めて質問!!

    #include<stdio.h> #define NMAX 200 int n; int a[NMAX], x[NMAX]; void yomikomi() { for(n=0; scanf("%d%d",&a[n],&x[n])!=EOF;n++); return; } void hyouzi() { int i; for(i=0;i<n;i++) printf("%5d %5d\n",a[i],x[I]); return; } void seiretu() { int i,j,max,k,w; for(i=0;i<n-1;i++){ max=x[i];k=i; for(j=i+1;j<n;j++) if(x[j]>max){ max=x[j];k=j; } w=a[k];a=[k]=a[i];a[i]=w; x[k]=x[i]; x[i]=max; } return; } main() { printf("sorting\n"); yomikomi(); printf(\nInput data\n"); hyouzi(); seiretu(); printf(\nSorted data\n); hyouzi(); return(0); } これを改良して偶数と奇数に分けてソートするプログラムがわかればいいのですが。。まだ慣れないものですいませんでした。

  • C言語のポインタのプログラムについての質問です。

    C言語のポインタについて質問です。 nこの配列データaを受け取り、それらの値をもとに、2つのデータを引数で受け取って交換する関数void swap(double *a,*b)を用いることにより最終的に降順に並べ替えて出力したのち、それらを平均(average)と標準偏差(standard deviation)を引数で受け渡す関数 void calc_ave_stddev(int n,double a[],double *ave,double*stddev)を利用して出力されるプログラムを教えてほしいです。 main関数内での書式は printf("enter n:"); scanf("%d,&n"); for(i=0;i<n;i++){ printf("enter a[%d]:",i); scanf("%lf"&a[i]); } main関数での結果の出力は、 for(i=0;i<n;i++){ printf("a[%d]=%lf\n",a[i]); } printf("ave=%lf stddev=%lf\n",ave,stddev); です。

  • どこがおかしいのでしょうか??

    下のプログラムはsinの級数展開を求めるプログラム…を書いたつもりなんですが計算機と違う値がでてしまい困っています。どこをどう直せばいいのか教えてもらえませんでしょうか??それともこのプログラムではうまくいかないのでしょうか?返答をお願いします。 #include <stdio.h> #include<math.h> #define NMAX 100 main() { float eps,x,t,s; int n; printf("Taylor series\n"); scanf("%g", &eps); printf("eps=%g\n", eps); for(;scanf("%g", &x)!=EOF;){ printf("\nx=%g\n n\tt\t\ts\n", x); t=s=x; for(n=1;n<NMAX;n++){ t*=-x*x/((2*n+1)*(2*n)); s+=t; printf("%2d %15.6e %15.6e\n", n, t, s); if(fabs(t)<eps) break; } if(n>=NMAX) printf("--- not converged ---\n"); printf("exp(%g)=%g\tn=%d\n", x, s, n); } return(0); }