fork download
  1. #include <stdio.h>
  2.  
  3. // 再帰関数
  4. // □引数
  5. // org_count ... 入力全体の個数。平均計算に使用。不変
  6. // count ... 残りの入力数。呼び出し毎に1減らすことで再帰処理を制御する
  7. // total ... 入力された値の合計。平均計算に使用。呼び出し毎に加算する。
  8. // average ... 平均値の取り出し用
  9. // disp_total ... 偏差の集計用。tempo変数と同じ役割。
  10. void calc(const int org_count, int count, double total, double *average, double *disp_total)
  11. {
  12. double value;
  13.  
  14. if (count == 0) {
  15. *average = total / (double)org_count;
  16. return;
  17. }
  18.  
  19. scanf("%lf", &value);
  20. calc(org_count, count-1, total + value, average, disp_total);
  21.  
  22. *disp_total += (value - *average)*(value - *average);
  23. }
  24.  
  25. //
  26. // □引数
  27. // count ... 入力したい数。
  28. // average ... 平均値を取り出す。
  29. // dispersion ... 分散を取り出す。
  30. //
  31. // □備考
  32. // 呼び出しやすいように整形した関数のエントリポイントです
  33. // 初期化処理や必要な変数を確保しています
  34. void CalculateAverageAndDispersion(int count, double *average, double *dispersion)
  35. {
  36. double t = 0.0;
  37. double a = 0.0;
  38.  
  39. if (count > 0) calc(count, count, 0.0, &a, &t);
  40.  
  41. if (average) *average = a;
  42. if (dispersion) *dispersion = t / (double)count;
  43. }
  44.  
  45.  
  46. int main(void) {
  47. int count;
  48. double average, dispersion;
  49.  
  50. printf("input number of data:");
  51. scanf("%d", &count);
  52.  
  53. printf("\n");
  54.  
  55. CalculateAverageAndDispersion(count, &average, &dispersion);
  56.  
  57. printf("ave : %lf\n", average);
  58. printf("dis : %5.3lf", dispersion);
  59.  
  60. return 0;
  61. }
Success #stdin #stdout 0s 2164KB
stdin
10
3.9
10.4
9.5
7.5
2.8
4.8
2.9
8.1
3.2
9.9
stdout
input number of data:
ave : 6.300000
dis : 8.612