- 締切済み
平均、分散を求めたときの入力エラー
入力された10個の数字について平均、分散を求めるため素朴に書いてみました。 #include<stdio.h> int main(){ char buf[256]; double a,b,c,d,e,f,g,h,i,j,mean,variance; fgets(buf,256,stdin); sscanf(buf,"%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j); if(!sscanf(buf,"%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j)){ printf("数字を入力してください。\n"); }else{ mean=(a+b+c+d+e+f+g+h+i+j)/10; variance=((a-mean)*(a-mean)+(b-mean)*(b-mean)+(c-mean)*(c-mean)+(d-mean)*(d-mean)+(e-mean)*(e-mean)+(f-mean)*(f-mean)+(g-mean)*(g-mean)+(h-mean)*(h-mean)+(i-mean)*(i-mean)+(j-mean)*(j-mean))/10; printf("平均=%lf\n",mean); printf("分散=%lf\n",variance); return 0; } } 途中、数字が入力されなかったときに”数字を入力してください。” と書きたかったのですがうまくいきません。あと、10個より少なく入力したときのエラー表示もしたいのですが… 教えてください。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★scanf で 10 回ループして入力したらどうですか。 ・あと回答者 No.1 さんのアドバイス通りに配列を使うとスマートに記述できると思います。 まぁ、とにかくサンプルを載せますので。どうぞ。 サンプル: #include <stdio.h> #define MAX 10 int main( void ) { double num[ MAX ]; ←10個の数値 double tmp; double mean; double variance; int i; /* 入力部 */ printf( "数字を入力してください。\n" ); for ( i = 0 ; i < MAX ; i++ ){ if ( scanf(" %lf",&num[i]) == EOF ){ break; } } /* 入力不足かチェック */ if ( i < MAX ){ printf( "入力が %d 個、足りません。\n", (i - MAX) ); return( 1 ); } /* 平均の計算 */ for ( mean = 0.0, i = 0 ; i < MAX ; i++ ){ mean += num[ i ]; ←『mean = (mean + num[i]);』のこと。 } mean = (mean / MAX); /* 分散の計算 */ for ( variance = 0.0, i = 0 ; i < MAX ; i++ ){ tmp = (num[i] - mean); variance += (tmp * tmp); ←『variance = (variance + (tmp * tmp));』のこと。 } variance = (variance / MAX); /* 表示 */ printf( "平均=%lf\n", mean ); printf( "分散=%lf\n", variance ); return( 0 ); } 解説: ・scanf 関数で1つずつ数字を入力してもらいます。 入力が 10 個に満たない場合は if ( i < MAX ) でチェックしてエラーを表示しています。 ・データが 10 個入力されていたら平均、分散の計算を行います。 配列 num を使っていますので for 文で繰り返せば簡単に計算できます。 ・以上。おわり。→fgets、sscanf を使う場合は適切に書き換えて下さい。
- asuncion
- ベストアンサー率33% (2127/6289)
素朴に書くなら、配列を使うべきでありましょう。 入力する数値が10個だからa~jの範囲ですみますが、 もし100個だったらどうしますか? なお、sscanf()の戻り値は ・正しく変換し、入力された項目の数(今回の例では10)、あるいは ・EOF(ファイルの終了時、エラー発生時) です。そのif文では正しくない入力を検知できません。