■
下記の内容のcsvファイルを読み込んで教科ごとの平均点を求めるプログラムを作りました。
#生徒番号,国語,数学,英語 10101,80,70,90 10102,90,50,80 10103,70,70,90 10104,100,100,100 10105,60,100,80 10106,80,80,70
ここで、エラーが出ました。悩んだのは2点。Array.newとcsvの読み込みです。
まず、
Array.newの使い方を間違えました。私はArray.newを使って初期化したかったので、
ARRAY_NUM = 3 a = Array.new(ARRAY_NUM, "")
上記のように書いたのですが、こうすると
=> ["", "", ""]
こんな配列ができます。初期化はしたいけど、a=["", "", ""]は意図していません。
a = Array.new
こうすることで配列としてaを初期化できます。
そしてもうひとつ。
csvファイルから読み込んだ数字を配列に格納します。
格納された数字は教科ごとに平均を出します。
average = Array.new(ARRAY_NUM, "") 0.upto(line_num) do |i| average[JAPANESE] += a[i][JAPANESE] average[MATH] += a[i][MATH] average[ENGLISH] += a[i][ENGLISH] end average[JAPANESE] /= line_num average[MATH] /= line_num average[ENGLISH] /= line_num
ここで、csvファイルから読み込んだ数字は文字型です。なので、文字型から数値へ変換する必要があります。Intergerを使うと
average = Array.new(ARRAY_NUM, 0) 0.upto(line_num - 1) do |i| average[JAPANESE] += Integer(a[i][JAPANESE]) average[MATH] += Integer(a[i][MATH]) average[ENGLISH] += Integer(a[i][ENGLISH]) end average[JAPANESE] /= line_num average[MATH] /= line_num average[ENGLISH] /= line_num
Array.newを理解しきれていなかったと数値型の変換をすっかり忘れていたのが原因でした。