• 締切済み

c言語

n人の名前、と国数英の点数を読み込み各人の平均点、標準偏差を求め見やすく出力するぷろぐらむです osはlinuxでコンパイラはgccです。 変数が多くなってしまいよくわかりません。 もっと簡単になりますか? #include<stdio.h> #include<math.h> #define N 50 main() { int eng[N], jap[N], math[N], n=0, i=0; char name[N][12]; double sum[N], SUM, sum1, sum2, sum3, ave1, ave2, ave3, vari, s_devi; printf("名前 合計点"); while(scanf("%s %d %d %d",&name[n],&eng[n],&jap[n],&math[n]) != EOF) { sum[i] = eng[n]+jap[n]+math[n]; sum1 += eng[n]; sum2 += jap[n]; sum3 += math[n]; printf("%-12s%4d",name[n], sum[i]); n++; i++; } ave1 = sum1/n; ave2 = sum2/n; ave3 = sum3/n; for(i=0; i<n; i++) { SUM += (eng[i]-ave1)*(eng[i]-ave1); } vari = SUM/n; s_devi = sqrt(vari); printf("English\n average = %f\nstandard deviation = %f\n\n",ave1,s_devi); for(i=0; i<n; i++) { SUM += (jap[i]-ave2)*(jap[i]-ave2); } vari = SUM/n; s_devi = sqrt(vari); printf("japanese\n average = %f\nstandard deviation = %f\n\n",ave2,s_devi); for(i=0; i<n; i++) { SUM += (math[i]-ave3)*(math[i]-ave3); } vari = SUM/n; s_devi = sqrt(vari); printf("math\n average = %f\n standard deviation = %f\n\n",ave3,s_devi); }

みんなの回答

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

>int eng[N], jap[N], math[N], n=0, i=0; >char name[N][12]; >double sum[N], SUM, sum1, sum2, sum3, ave1, ave2, ave3, vari, s_devi; 構造体にまとめられそうなモノがあるようですが…。 struct Data { char name[12]; int eng, jap, math; double sum; } PersonalData[N]; とか、そんな感じでしょうか。 構造体の開設などでよく使われるパターンですので、検索すれば出てくるんじゃないでしょうか。 「構造体 成績」で検索するとか。 # 件名、もう少し考慮した方がよろしいかと。

noname#74733
質問者

補足

構造体はまだならってないのでわからないです すみません 関数、再帰はならいました

noname#88772
noname#88772
回答No.2

 こんにちは。  気づいた事を書いておきます  ・変数を配列で取っておく必要があるのか?  ・同じ事をやっているところは関数でまとめられるのでは?  ご参考までに。

noname#74733
質問者

補足

変数を配列にしなかったら変数が多くなりませんか? それとも他に方法があるのでしょうか?

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

>printf("%-12s%4d",name[n], sum[i]); >n++; >i++; このあたりの、nとiの違いは何ですか? 今のコードでは、標準偏差を求めている箇所で、SUMをゼロで初期化せずに足し込んでいるため、 結果がおかしいと思います。 なお、合計点、平均点、標準偏差を求めるロジックは教科に関係なく同じですね。 そういう、共通しているロジックを関数として切り出すとよいでしょう。

noname#74733
質問者

補足

ありがとうございます。 関数にしたいのですが関数をまだいまいち理解してないので

関連するQ&A