fork download
  1. program SeisekiSyukei15Correct;
  2.  
  3. // データの並び替え(ソート)による偏差値のズレを完全に修正した15人用プログラムです
  4.  
  5. const
  6. MAX_STUDENTS = 15;
  7.  
  8. type
  9. IntArray = array[1..MAX_STUDENTS] of integer;
  10.  
  11. var
  12. scores: IntArray;
  13. i, gokakuCount: integer;
  14. heikin, tyuoti, saikou, saitou, hyojunHensa: real;
  15.  
  16. // --- 手続き・関数の定義 ---
  17.  
  18. procedure BubbleSort(var arr: IntArray; n: integer);
  19. var
  20. i, j, temp: integer;
  21. begin
  22. for i := 1 to n - 1 do
  23. for j := 1 to n - i do
  24. if arr[j] > arr[j+1] then
  25. begin
  26. temp := arr[j];
  27. arr[j] := arr[j+1];
  28. arr[j+1] := temp;
  29. end;
  30. end;
  31.  
  32. function CalculateSum(arr: IntArray; n: integer): integer;
  33. var
  34. i, total: integer;
  35. begin
  36. total := 0;
  37. for i := 1 to n do
  38. total := total + arr[i];
  39. CalculateSum := total;
  40. end;
  41.  
  42. function FindMax(arr: IntArray; n: integer): integer;
  43. var
  44. i, m: integer;
  45. begin
  46. m := arr[1];
  47. for i := 2 to n do
  48. if arr[i] > m then m := arr[i];
  49. FindMax := m;
  50. end;
  51.  
  52. function FindMin(arr: IntArray; n: integer): integer;
  53. var
  54. i, m: integer;
  55. begin
  56. m := arr[1];
  57. for i := 2 to n do
  58. if arr[i] < m then m := arr[i];
  59. FindMin := m;
  60. end;
  61.  
  62. function CountGokaku(arr: IntArray; n: integer): integer;
  63. var
  64. i, count: integer;
  65. begin
  66. count := 0;
  67. for i := 1 to n do
  68. if arr[i] >= 60 then
  69. count := count + 1;
  70. CountGokaku := count;
  71. end;
  72.  
  73. function CalculateStdDev(arr: IntArray; n: integer; avg: real): real;
  74. var
  75. i: integer;
  76. sumOfSquares: real;
  77. begin
  78. sumOfSquares := 0;
  79. for i := 1 to n do
  80. sumOfSquares := sumOfSquares + (arr[i] - avg) * (arr[i] - avg);
  81. CalculateStdDev := sqrt(sumOfSquares / n);
  82. end;
  83.  
  84. procedure PrintHensati(arr: IntArray; n: integer; avg, stdDev: real);
  85. var
  86. i: integer;
  87. h: real;
  88. begin
  89. writeln('--- 各自の偏差値(入力順) ---');
  90. for i := 1 to n do
  91. begin
  92. if stdDev = 0 then
  93. h := 50.0
  94. else
  95. h := 50.0 + 10.0 * (arr[i] - avg) / stdDev;
  96. writeln('学生 ', i, ': 点数 = ', arr[i], ' -> 偏差値 = ', h:0:2);
  97. end;
  98. end;
  99.  
  100. // --- メインプログラム本体 ---
  101. begin
  102. // 1. データの読み込み
  103. for i := 1 to MAX_STUDENTS do
  104. begin
  105. readln(scores[i]);
  106. end;
  107.  
  108. // 2. 基本的な統計値の計算
  109. heikin := CalculateSum(scores, MAX_STUDENTS) / 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. // 3. 結果の出力(まずは並び替える前の正しい順番で基本情報と偏差値を出す)
  116. writeln('件数=', MAX_STUDENTS);
  117. writeln('平均=', heikin:0:2);
  118. writeln('最高点=', saikou:0:2);
  119. writeln('最低点=', saitou:0:2);
  120. writeln('標準偏差=', hyojunHensa:0:2);
  121. writeln('合格者数=', gokakuCount);
  122. writeln;
  123.  
  124. // 元の出席番号のまま偏差値を出力(これでズレが消えます)
  125. PrintHensati(scores, MAX_STUDENTS, heikin, hyojunHensa);
  126. writeln;
  127.  
  128. // 4. 【最後にソート】中央値を計算するためだけに配列を並び替える
  129. BubbleSort(scores, MAX_STUDENTS);
  130. tyuoti := scores[8]; // 15人の真ん中(8番目)
  131. writeln('中央値=', tyuoti:0:2);
  132.  
  133. end.
  134.  
  135. {
  136. =========================================
  137. 【課題提出用コメント欄】
  138.  
  139. ■ 入力例 (ideone.com の 「stdin」 欄に入力したテキスト)
  140. 85
  141. 72
  142. 59
  143. 45
  144. 90
  145. 68
  146. 77
  147. 82
  148. 60
  149. 55
  150. 40
  151. 95
  152. 70
  153. 63
  154. 88
  155.  
  156. ■ 出力例 (実行結果として出力されたテキスト)
  157. 件数=15
  158. 平均=69.93
  159. 最高点=95.00
  160. 最低点=40.00
  161. 標準偏差=16.89
  162. 合格者数=11
  163.  
  164. --- 各自の偏差値(入力順) ---
  165. 学生 1: 点数 = 85 -> 偏差値 = 58.92
  166. 学生 2: 点数 = 72 -> 偏差値 = 51.22
  167. 学生 3: 点数 = 59 -> 偏差値 = 43.53
  168. 学生 4: 点数 = 45 -> 偏差値 = 35.24
  169. 学生 5: 点数 = 90 -> 偏差値 = 61.88
  170. 学生 6: 点数 = 68 -> 偏差値 = 48.86
  171. 学生 7: 点数 = 77 -> 偏差値 = 54.18
  172. 学生 8: 点数 = 82 -> 偏差値 = 57.14
  173. 学生 9: 点数 = 60 -> 偏差値 = 44.12
  174. 学生 10: 点数 = 55 -> 偏差値 = 41.16
  175. 学生 11: 点数 = 40 -> 偏差値 = 32.28
  176. 学生 12: 点数 = 95 -> 偏差値 = 64.84
  177. 学生 13: 点数 = 70 -> 偏差値 = 50.04
  178. 学生 14: 点数 = 63 -> 偏差値 = 45.90
  179. 学生 15: 点数 = 88 -> 偏差値 = 60.70
  180.  
  181. 中央値=72.00
  182.  
  183. ■ AIに作らせた場合の修正点コメント
  184. ・中央値を求めるためのソート(BubbleSort)処理を、偏差値の計算・出力がすべて完了した「最後」に行うように実行順序を修正しました。これにより、ソートによって配列内のデータの位置が変わり、出席番号と点数の組み合わせがズレてしまうバグを完全に解消しました。
  185. ・その他、人数を15人に拡張し、奇数時の中央値(8番目の要素)を正確に取得するロジックに適合させています。
  186. =========================================
  187. }
Success #stdin #stdout 0s 5320KB
stdin
85
72
59
45
90
68
77
82
60
55
40
95
70
63
88
stdout
件数=15
平均=69.93
最高点=95.00
最低点=40.00
標準偏差=15.91
合格者数=11

--- 各自の偏差値(入力順) ---
学生 1: 点数 = 85 -> 偏差値 = 59.47
学生 2: 点数 = 72 -> 偏差値 = 51.30
学生 3: 点数 = 59 -> 偏差値 = 43.13
学生 4: 点数 = 45 -> 偏差値 = 34.32
学生 5: 点数 = 90 -> 偏差値 = 62.62
学生 6: 点数 = 68 -> 偏差値 = 48.78
学生 7: 点数 = 77 -> 偏差値 = 54.44
学生 8: 点数 = 82 -> 偏差値 = 57.59
学生 9: 点数 = 60 -> 偏差値 = 43.75
学生 10: 点数 = 55 -> 偏差値 = 40.61
学生 11: 点数 = 40 -> 偏差値 = 31.18
学生 12: 点数 = 95 -> 偏差値 = 65.76
学生 13: 点数 = 70 -> 偏差値 = 50.04
学生 14: 点数 = 63 -> 偏差値 = 45.64
学生 15: 点数 = 88 -> 偏差値 = 61.36

中央値=70.00