/* Part6 演習問題4 */
/* 成績データの平均値と分散(2次元配列版) */
#include <stdio.h>

int main(void)
{
  int score[100][10],n,m ;    /* nは人数、mは科目数 */
  double s[10],dss[10] ;       /* 合計と偏差平方和 */
  double mean[10],var[10] ;   /* 平均値と分散 */
  int i,j ;
  int sw ;                    /* データ入力終了判定用 */

  printf("科目数(上限は10): ") ;
  scanf("%d",&m) ;
  if((m<1)||(m>10)) {
    printf("科目数が誤りです。\n") ;
    return(1) ;
  }

  printf("成績を入力してください(100点満点、負の値で終了)。\n") ;

  n=0 ;
  for(i=0;i<m;i++) {
    s[i]=0 ;
    dss[i]=0 ;
  }

  while(1) {
    printf("%d> ",(n+1)) ;
    for(i=0;i<m;i++){
      scanf("%d",&score[n][i]) ;
    }
   
    sw=0 ;
    for(i=0;i<m;i++) {
      if(score[n][i]>100) {
    printf("満点を超えています。正しい成績を入力し直してください。\n") ;
    sw = -1 ;  /* 入力ミスのデータは計算しない  */
    break ;
      }
      else if(score[n][i]<0) {
    sw = 1;
    break ;
      }
    }
    if(sw==0){       /* 入力データは正しい */
       for(i=0;i<m;i++) {
     s[i] = s[i] + score[n][i] ;    /* 合計  */
       }
       n++ ;
       if(n==100) {
     printf("データ数が上限に達しました(入力終了)。\n") ;
     break ;
       }
     }
    else if(sw>0) break ; /* データ入力終了  */
  }

  if(n>0) {
    for(i=0;i<m;i++) {
      mean[i] = s[i]/n ;
      for(j=0;j<n;j++) {
    dss[i] = dss[i] + (score[j][i]-mean[i])*(score[j][i]-mean[i]) ; /* 偏差平方和 */
    }
    var[i] = dss[i]/n ;
    }
    printf("データ件数は%dです。\n",n) ;
    for(i=0;i<m;i++) {
      printf("科目番号%dの平均値は%f  分散は%fです。\n",i+1,mean[i],var[i]) ;
    }
  }
  else {
    printf("データが入力されていません。\n") ;
  }
  return(0) ;
}
 
% gcc -Wall part6-4.c
% ./a.out
科目数(上限は10): 2
成績を入力してください(100点満点、負の値で終了)。
1> 78 78
2> 76 76
3> 65 99
4> 102 80
満点を超えています。正しい成績を入力し直してください。
4> 99 98
5> 80 99
6> 56 56
7> 81 60
8> 92 56
9> 77 66
10> 59 65
11> 60 71
12> -1 0
データ件数は11です。
科目番号1の平均値は74.818182  分散は171.057851です。
科目番号2の平均値は74.909091  分散は257.719008です。

  1. 満点をこえた値を入力すると,全科目の得点が無効となり,再入力を求める.
  2. 得点に負の値が含まれていると,入力終了となる.
  3. 科目には便宜的に連続番号を割り当てている.