fork download
  1. program SeisekiSyukei15Unbiased;
  2.  
  3. const
  4. MAX_STUDENTS = 15;
  5.  
  6. type
  7. IntArray = array[1..MAX_STUDENTS] of integer;
  8.  
  9. var
  10. scores, sortedScores: IntArray;
  11. i, gokakuCount, totalSum: integer;
  12. heikin, tyuoti, saikou, saitou, hyojunHensa: real;
  13.  
  14. procedure BubbleSort(var arr: IntArray; n: integer);
  15. var
  16. i, j, temp: integer;
  17. begin
  18. for i := 1 to n - 1 do
  19. for j := 1 to n - i do
  20. if arr[j] > arr[j+1] then
  21. begin
  22. temp := arr[j];
  23. arr[j] := arr[j+1];
  24. arr[j+1] := temp;
  25. end;
  26. end;
  27.  
  28. function CalculateSum(arr: IntArray; n: integer): integer;
  29. var
  30. i, total: integer;
  31. begin
  32. total := 0;
  33. for i := 1 to n do
  34. total := total + arr[i];
  35. CalculateSum := total;
  36. end;
  37.  
  38. function FindMax(arr: IntArray; n: integer): integer;
  39. var
  40. i, m: integer;
  41. begin
  42. m := arr[1];
  43. for i := 2 to n do
  44. if arr[i] > m then m := arr[i];
  45. FindMax := m;
  46. end;
  47.  
  48. function FindMin(arr: IntArray; n: integer): integer;
  49. var
  50. i, m: integer;
  51. begin
  52. m := arr[1];
  53. for i := 2 to n do
  54. if arr[i] < m then m := arr[i];
  55. FindMin := m;
  56. end;
  57.  
  58. function CountGokaku(arr: IntArray; n: integer): integer;
  59. var
  60. i, count: integer;
  61. begin
  62. count := 0;
  63. for i := 1 to n do
  64. if arr[i] >= 60 then
  65. count := count + 1;
  66. CountGokaku := count;
  67. end;
  68.  
  69. // 【修正箇所】分母を n - 1 (14) にしてExcel等の統計関数と完全に一致させる標準偏差関数
  70. function CalculateStdDev(arr: IntArray; n: integer; avg: real): real;
  71. var
  72. i: integer;
  73. sumOfSquares, diff: real;
  74. begin
  75. sumOfSquares := 0.0;
  76. for i := 1 to n do
  77. begin
  78. diff := arr[i] - avg;
  79. sumOfSquares := sumOfSquares + (diff * diff);
  80. end;
  81. // ここを n - 1 に変更しています
  82. CalculateStdDev := sqrt(sumOfSquares / (n - 1));
  83. end;
  84.  
  85. procedure PrintHensati(arr: IntArray; n: integer; avg, stdDev: real);
  86. var
  87. i: integer;
  88. h: real;
  89. begin
  90. writeln('--- 各自の偏差値(入力順) ---');
  91. for i := 1 to n do
  92. begin
  93. if stdDev = 0 then
  94. h := 50.0
  95. else
  96. h := 50.0 + 10.0 * (arr[i] - avg) / stdDev;
  97. writeln('学生 ', i, ': 点数 = ', arr[i], ' -> 偏差値 = ', h:0:2);
  98. end;
  99. end;
  100.  
  101. begin
  102. for i := 1 to MAX_STUDENTS do
  103. begin
  104. readln(scores[i]);
  105. sortedScores[i] := scores[i];
  106. end;
  107.  
  108. totalSum := CalculateSum(scores, MAX_STUDENTS);
  109. heikin := totalSum / MAX_STUDENTS;
  110. saikou := FindMax(scores, MAX_STUDENTS);
  111. saitou := FindMin(scores, MAX_STUDENTS);
  112. gokakuCount := CountGokaku(scores, MAX_STUDENTS);
  113. hyojunHensa := CalculateStdDev(scores, MAX_STUDENTS, heikin);
  114.  
  115. BubbleSort(sortedScores, MAX_STUDENTS);
  116. tyuoti := sortedScores[8];
  117.  
  118. writeln('件数=', MAX_STUDENTS);
  119. writeln('平均=', heikin:0:2);
  120. writeln('中央値=', tyuoti:0:2);
  121. writeln('最高点=', saikou:0:2);
  122. writeln('最低点=', saitou:0:2);
  123. writeln('標準偏差=', hyojunHensa:0:2);
  124. writeln('合格者数=', gokakuCount);
  125. writeln;
  126.  
  127. PrintHensati(scores, MAX_STUDENTS, heikin, hyojunHensa);
  128. end.
Success #stdin #stdout 0s 5316KB
stdin
85
72
59
45
90
68
77
82
60
55
40
95
70
63
88
stdout
件数=15
平均=69.93
中央値=70.00
最高点=95.00
最低点=40.00
標準偏差=16.46
合格者数=11

--- 各自の偏差値(入力順) ---
学生 1: 点数 = 85 -> 偏差値 = 59.15
学生 2: 点数 = 72 -> 偏差値 = 51.26
学生 3: 点数 = 59 -> 偏差値 = 43.36
学生 4: 点数 = 45 -> 偏差値 = 34.86
学生 5: 点数 = 90 -> 偏差値 = 62.19
学生 6: 点数 = 68 -> 偏差値 = 48.83
学生 7: 点数 = 77 -> 偏差値 = 54.29
学生 8: 点数 = 82 -> 偏差値 = 57.33
学生 9: 点数 = 60 -> 偏差値 = 43.97
学生 10: 点数 = 55 -> 偏差値 = 40.93
学生 11: 点数 = 40 -> 偏差値 = 31.82
学生 12: 点数 = 95 -> 偏差値 = 65.23
学生 13: 点数 = 70 -> 偏差値 = 50.04
学生 14: 点数 = 63 -> 偏差値 = 45.79
学生 15: 点数 = 88 -> 偏差値 = 60.97