#include<stdio.h> #include<math.h> const int BUFFER_SIZE = 100; main() { int data; /* 入力データ */ int num = 0; /* データ数の記憶 */ int zero = 0; /* 0を検知するための制御変数 */ double arithmetic = 0.0; /* 算術平均 */ double geometric = 1.0; /* 幾何平均 */ double harmonic = 0.0; /* 調和平均 */ int n, i; char buf[BUFFER_SIZE], c; /* データを読み込み,加算,乗算,0検知を行う.データが整数である限り繰り返す.*/ printf("Please input data : "); while(true){ /* データ(1行分読み込み) */ fgets(buf,BUFFER_SIZE,stdin); /* データ取り出しと計算 */ n = sscanf(buf,"%d %c",&data,&c); if( ( n == -1 ) || ( n == 0 ) ) { break; } else if(n == 1) { // the number of data is 1. num++; arithmetic = arithmetic + (double)data; geometric = geometric * (double)data; if(data == 0) { zero = 1; } if(zero == 0) { harmonic = harmonic + 1.0 / (double)data; } } else if(n == 2) { // the number of data is larger than 2. i = 0; while(true) { num++; arithmetic = arithmetic + (double)data; geometric = geometric * (double)data; if(data == 0) { zero = 1; } if(zero == 0) { harmonic = harmonic + 1.0 / (double)data; } // 空白文字を読み飛ばす while(true) { if(buf[i] == ' ') { i++; } else { break; } } // 数字(0から9)を読み飛ばす while(true){ if(buf[i] >= '0' && buf[i] <= '9') { i++; } else { break; } } // 行末なら終える if(buf[i] == '\n') { break; } // データ読み込み.読み込みに成功したら次の文字へ(i++), 失敗したら終える(break). n = sscanf(buf+i,"%d",&data); if(n == 0) { break; } i++; } } if(n == 0) { break; } } printf("算術平均 = %lf\n",arithmetic / (double)num); printf("幾何平均 = %lf\n",pow(geometric,1.0 / (double)num)); if(zero == 0) { printf("調和平均 = %lf\n",(double)num / harmonic); } else { printf("調和平均 = 無限大(0除算)\n"); } return 0; } |
#include<stdio.h> #include<math.h> const int MAX = 10; const int BUFFER_SIZE = 100; main() { int data; /* 入力データ */ double inputdata[MAX]; /* 入力データを格納する配列 */ int n, i; int num = 0; double M = 0.0; /* 算術平均 */ double var; /* 分散 */ char buf[BUFFER_SIZE],c; /* データを読み込み,加算,配列への格納を行う */ printf("Please input data : "); while(true){ /* データ(1行分読み込み) */ fgets(buf,BUFFER_SIZE,stdin); /* データ取り出しと計算 */ n = sscanf(buf,"%d %c",&data,&c); if( ( n == -1 ) || ( n == 0 ) ) { break; } else if(n == 1) { // the number of data is 1. inputdata[num++] = (double)data; M = M + (double)data; } else if(n == 2) { // the number of data is larger than 2. i = 0; while(true){ inputdata[num++] = (double)data; M = M + (double)data; // 空白文字を読み飛ばす while(true){ if(buf[i] == ' ') { i++; } else { break; } } // 数字(0から9)を読み飛ばす while(true){ if(buf[i] >= '0' && buf[i] <= '9') { i++; } else { break; } } // 行末なら終える if(buf[i] == '\n') { break; } // データ読み込み.読み込みに成功したら次の文字へ(i++), 失敗したら終える(break). n = sscanf(buf+i,"%d",&data); if(n == 0) { break; } i++; } } if(n == 0) { break; } } M = M / (double)num; /* 分散の計算(入力されたデータ数の回数だけ繰り返す)*/ for(var = 0.0 , i = 0 ; i < num ; i++){ var = var + pow((inputdata[i] - M),2); } if(num <= MAX){ printf("算術平均 = %lf\n",M); printf("分散 = %lf\n",var / (double)num); } else { printf("入力を%d個以下にしてください。\n",MAX); } return 0; } |