無題
無題
n人の学生の名前と英語,国語,数学の点数を読み込み,各人の3科
目の合計点,また各教科の平均点と標準偏差を計算して出力するプログラムを
作れという問題で下記のように作りました。
linuxとgccをつかってます。
実行できるのですがもっとコンパクトなプログラムにできないでしょうか?
最近関数を習ったのでそれを使うのではないかとおもうのですがよくわから
ないので教えてもらえるとありがたいです。
forの部分とかまとめられますか?
#include<stdio.h>
#include<math.h>
#define N 50
main()
{
int eng[N], jap[N], math[N], sum, n=0, i;
char name[N][12];
double SUM, sum1, sum2, sum3, ave1, ave2, ave3, vari, s_devi;
while(scanf("%s %d %d %d",&name[n][0],&eng[n],&jap[n],&math[n]) != EOF)
{
sum=0;
sum = eng[n]+jap[n]+math[n];
sum1 += eng[n];
sum2 += jap[n];
sum3 += math[n];
printf("name , sum : %-12s %4d\n",name[n], sum);
n++ ;
}
ave1 = sum1/n;
ave2 = sum2/n;
ave3 = sum3/n;
for(SUM=0,i=0; i<n; i++)
{
SUM += (eng-ave1)*(eng-ave1);
}
vari = SUM/n;
s_devi = sqrt(vari);
printf("English\naverage = %.2f\nstandard deviation = %.2f\n\n",ave1,s_devi);
for(SUM=0,i=0; i<n; i++)
{
SUM += (jap-ave2)*(jap-ave2);
}
vari = SUM/n;
s_devi = sqrt(vari);
printf("japanese\naverage = %.2f\nstandard deviation = %.2f\n\n",ave2,s_devi);
for(SUM=0,i=0; i<n; i++)
{
SUM += (math-ave3)*(math-ave3);
}
vari = SUM/n;
s_devi = sqrt(vari);
printf("math\naverage = %.2f\nstandard deviation = %.2f\n\n",ave3,s_devi);
}
目の合計点,また各教科の平均点と標準偏差を計算して出力するプログラムを
作れという問題で下記のように作りました。
linuxとgccをつかってます。
実行できるのですがもっとコンパクトなプログラムにできないでしょうか?
最近関数を習ったのでそれを使うのではないかとおもうのですがよくわから
ないので教えてもらえるとありがたいです。
forの部分とかまとめられますか?
#include<stdio.h>
#include<math.h>
#define N 50
main()
{
int eng[N], jap[N], math[N], sum, n=0, i;
char name[N][12];
double SUM, sum1, sum2, sum3, ave1, ave2, ave3, vari, s_devi;
while(scanf("%s %d %d %d",&name[n][0],&eng[n],&jap[n],&math[n]) != EOF)
{
sum=0;
sum = eng[n]+jap[n]+math[n];
sum1 += eng[n];
sum2 += jap[n];
sum3 += math[n];
printf("name , sum : %-12s %4d\n",name[n], sum);
n++ ;
}
ave1 = sum1/n;
ave2 = sum2/n;
ave3 = sum3/n;
for(SUM=0,i=0; i<n; i++)
{
SUM += (eng-ave1)*(eng-ave1);
}
vari = SUM/n;
s_devi = sqrt(vari);
printf("English\naverage = %.2f\nstandard deviation = %.2f\n\n",ave1,s_devi);
for(SUM=0,i=0; i<n; i++)
{
SUM += (jap-ave2)*(jap-ave2);
}
vari = SUM/n;
s_devi = sqrt(vari);
printf("japanese\naverage = %.2f\nstandard deviation = %.2f\n\n",ave2,s_devi);
for(SUM=0,i=0; i<n; i++)
{
SUM += (math-ave3)*(math-ave3);
}
vari = SUM/n;
s_devi = sqrt(vari);
printf("math\naverage = %.2f\nstandard deviation = %.2f\n\n",ave3,s_devi);
}
Re:無題
こんばんは。お世話になります。
ちょっと気になったので、横レスごめんなさい。(謝
n人の学生の名前と英語,国語,数学の点数を読み込み,各人の3科
目の合計点,また各教科の平均点と標準偏差を計算して出力するプログラムを
作れ
何となく検索してみたのですが
http://oshiete1.goo.ne.jp/qa4466285.html
http://qanda.rakuten.ne.jp/qa4466285.html
http://okwave.jp/qa4466285.html
http://oshiete.hito2.jp/qa4466285.html
http://soudan1.biglobe.ne.jp/qa4466285.html
http://qa.mapion.co.jp/qa4466285.html
(その他)
で、引っかかりました。
相変わらず変な意味は無いのですが、何でこれで検索にかかるのでしょうか?
初心者さん、ごめんなさい。
すごく気になったので、すみません。
ちょっと気になったので、横レスごめんなさい。(謝
n人の学生の名前と英語,国語,数学の点数を読み込み,各人の3科
目の合計点,また各教科の平均点と標準偏差を計算して出力するプログラムを
作れ
何となく検索してみたのですが
http://oshiete1.goo.ne.jp/qa4466285.html
http://qanda.rakuten.ne.jp/qa4466285.html
http://okwave.jp/qa4466285.html
http://oshiete.hito2.jp/qa4466285.html
http://soudan1.biglobe.ne.jp/qa4466285.html
http://qa.mapion.co.jp/qa4466285.html
(その他)
で、引っかかりました。
相変わらず変な意味は無いのですが、何でこれで検索にかかるのでしょうか?
初心者さん、ごめんなさい。
すごく気になったので、すみません。
Re:無題
まず投稿前に規約をお読みになり、コードはタグを使い、トピには題名をつけて下さいね。
コードは変数名が重複している部分が多いですね。
ある変数をセットで使うなら構造体が便利です。
もし構造体についてご存じなければググって下さい。
コードはなるべく変えないように修正しました。
sum0, sum1, sum2は配列にして3回ループにすればさらに省けますね。
#include<stdio.h>
#include<string.h>
#include<math.h>
/* 登録人数最大数 */
#define N 50
/* 生徒のスコアデータ */
typedef struct{
int SubScore[3]; //教科別スコア
char Name[64]; //名前
double Average; //平均
}StudentData_t;
/* 教科別スコアデータ */
typedef struct{
char Name[12]; //教科名
double Average; //平均
double StdDev; //標準偏差
}SubScoreData_t;
int main(){
int n=0, i , s;
int sum;
double sum0, sum1, sum2;
double Val, SubSum;
StudentData_t StudentData[N] ={0,};
SubScoreData_t SubScoreData[3] ={0,};
/* 名前代入 */
strcpy(SubScoreData[0].Name, "English");
strcpy(SubScoreData[1].Name, "Japanese");
strcpy(SubScoreData[2].Name, "Math");
/* 初期化 */
sum0 = sum1 = sum2 = 0;
/* 代入しながらループ */
while( scanf("%s %d %d %d",
StudentData[n].Name,
&StudentData[n].SubScore[0],
&StudentData[n].SubScore[1],
&StudentData[n].SubScore[2] ) != EOF )
{
/* 3教科の合計 */
sum = StudentData[n].SubScore[0] + StudentData[n].SubScore[1] + StudentData[n].SubScore[2];
/* 各教科のスコアの加算 */
sum0 += StudentData[n].SubScore[0];
sum1 += StudentData[n].SubScore[1];
sum2 += StudentData[n].SubScore[2];
printf("name , sum : %-12s %4d\n", StudentData[n].Name, sum);
n++ ;
}
/* 平均の計算 */
SubScoreData[0].Average = sum0 / n;
SubScoreData[1].Average = sum1 / n;
SubScoreData[2].Average = sum2 / n;
/* 3教科分ループ */
for(s=0; s<3; s++)
{
/* 人数分ループ */
for(SubSum=0,i=0; i<n; i++)
{
SubSum += (StudentData.SubScore - SubScoreData.Average)
* (StudentData.SubScore - SubScoreData.Average) ;
}
Val = SubSum / n ;
SubScoreData.StdDev = sqrt(Val);
printf("%s\naverage = %.2f\nstandard deviation = %.2f\n\n",
SubScoreData.Name, SubScoreData.Average, SubScoreData.StdDev);
}
return 0;
}
Re:すみません
> 最近関数を習ったので
とありましたので関数にまとめたものを作ってみました。
教科の各点数の配列、人数、教科名を引数とし、
その教科の平均点と標準偏差を計算、出力する関数です。
コンパイルチェックはしていませんので注意。
# 利用する場合はちゃんと理解してからじゃないと、先生に聞かれたときが大変です。
とありましたので関数にまとめたものを作ってみました。
void show_ave_sdiv( const int* points, int n, const char* coursename ){ double ave, pt, ssum, sdiv; int i,sum; for(i = 0;i < n;++i){ sum += points; } ave = sum / (double)n; for(i = 0,ssum = 0;i < n;++i){ pt = points - ave; ssum += pt*pt; } sdiv = sqrt(ssum / n); printf("%s\naverage = %.2f\nstandard deviation = %.2f\n\n",coursename,ave,sdiv); }
教科の各点数の配列、人数、教科名を引数とし、
その教科の平均点と標準偏差を計算、出力する関数です。
コンパイルチェックはしていませんので注意。
# 利用する場合はちゃんと理解してからじゃないと、先生に聞かれたときが大変です。
Re:すみません
試しに、なんでもかんでも関数化してみました(^_^;)
#include<stdio.h> #include<math.h> #define N 5 /* プロトタイプ宣言 */ int calcSum(int eng, int jap, int math); double calcAvg(int* score, int count); double calcStandardDeviation(int *score, int count); /* メイン関数 */ int main() { char name[N][12]; int eng[N], jap[N], math[N], i; for (i = 0; i < N; ++i) { /* 文字列の入力 */ scanf("%s %d %d %d", name, &eng, &jap, &math); /* 入力データと合計値の表示 */ printf("name , sum : %-12s %4d\n\n", name, calcSum(eng, jap, math)); } /* 計算結果の表示 */ printf("English\naverage = %.2f\nstandard deviation = %.2f\n\n", calcAvg(eng, i), calcStandardDeviation(eng, i)); printf("Japanese\naverage = %.2f\nstandard deviation = %.2f\n\n", calcAvg(jap, i), calcStandardDeviation(jap, i)); printf("Math\naverage = %.2f\nstandard deviation = %.2f\n\n", calcAvg(math, i), calcStandardDeviation(math, i)); return 0; } /* 3教科の合計値の計算 */ int calcSum(int eng, int jap, int math) { return eng + jap + math; } /* 平均値の計算 */ double calcAvg(int* score, int count) { int i, sum = 0; for (i = 0; i < count; ++i) { sum += *(score + i); } return (double)(sum) / (double)(count); } /* 標準偏差の計算 */ double calcStandardDeviation(int *score, int count) { int i; double sum = 0.0, avg = calcAvg(score, count); for (i = 0; i < count; ++i) { sum += pow(*(score + i) - avg, 2.0); } return sqrt(sum / (double)count); }
Re:すみません
なるべく初心者さんがわかりやすいように変更をすくなくして、標準偏差だけを関数にしました。
関数呼び出しは
printf("English\naverage = %.2f\nstandard deviation = %.2f\n\n",ave1,StandardDeviation(n,eng,ave1));
double StandardDeviation(int n,int ten[/url],double ave) { double sd=0; int i; for(i=0; i<n; i++) { sd += (ten-ave)*(ten-ave); } sd = sqrt(sd/n); return sd; }
関数呼び出しは
printf("English\naverage = %.2f\nstandard deviation = %.2f\n\n",ave1,StandardDeviation(n,eng,ave1));