• 締切済み

平均、分散を求めたときの入力エラー

入力された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個より少なく入力したときのエラー表示もしたいのですが… 教えてください。よろしくお願いします。

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★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 を使う場合は適切に書き換えて下さい。

参考URL:
http://www9.plala.or.jp/sgwr-t/c/sec05.html
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

素朴に書くなら、配列を使うべきでありましょう。 入力する数値が10個だからa~jの範囲ですみますが、 もし100個だったらどうしますか? なお、sscanf()の戻り値は ・正しく変換し、入力された項目の数(今回の例では10)、あるいは ・EOF(ファイルの終了時、エラー発生時) です。そのif文では正しくない入力を検知できません。

関連するQ&A

専門家に質問してみよう