質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.35%

最高点、最低点、平均点など

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,449

peke

score 13

 データファイルのファイル名を,コマンドライン引数から受け取る。
合計点を記録するための変数(たとえば sum) をゼロに設定する.
最高点,最低点を記録するための変数(たとえば max, min ) を適切な値に設定する.
データ行の数を数えるカウンタをゼロに設定する。
ファイルをオープンする。
ファイルを1行ずつ読み込むためのループを作る。
1行読んでは,カンマで区切られたデータを分離し, 英数国3教科の点数の和(このための変数には,上述のsum は当然使えない.適当に短い変数名を使えばよい)を求める。
その点数と最高点を比較して,必要な処理を行う。 最低点についても同様。
3教科の点数の和を合計点に加算する.
カウンタを増やす。
ループが終了したら,平均を計算する。
実行例に従って,平均は小数第2位(ここでは printf を使う必要があることに注意!)まで,最高点と最低点は整数値で出力する。 行末には改行を入れ

この流れでプログラムを書いたつもりだったのですが、
うまく走りません。
どこが違うのでしょうか。

datafile = ARGV[0]
sum = 0
max = 100
min = 1000
count = 0
File.open(datafile) do |fp|

while line = fp.gets

fp.each_line do |line|
line = line.chomp!
c = line.split(",")
goukei = c[2].to_f + c[3].to_f + c[4].to_f
if max <= goukei then
max = goukei
end
if min >= goukei then
min = goukei
end
sum += goukei
count += 1
end

end

end

p sum

p count

average = sum /count
printf("平均点 %3.2f\n",average)
printf("最低点 %3d\n",max)
printf("最低点 %3d\n",min)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sokha

    2016/05/29 08:31

    自分で自分の質問を見た時にわかると思われますが、ソースをきちんと表示するマークダウンがありますので、それを使って綺麗にソースを置きましょう。
    また、どこで、どういうエラーが起きたのか詳しく書きましょう。

    キャンセル

  • otn

    2016/05/29 08:53

    コード部分を```Ruby と```という行で囲んでください。あと、インデント(字下げ)を行ってください。

    キャンセル

回答 2

checkベストアンサー

0

動作するコードを書いてみました。
質問文のコードとの差を研究してみていただければ幸いです。

datafile = ARGV[0]
sum = 0
max = -1      # 可能性がある最高点より小さい値を設定する
min = 100 * 4 # 可能性がある最低点より大きい値を設定する
count = 0

File.open(datafile) do |f|
  f.each_line do |line|
    next if line.chop == '' # 空行は無視する

    items = line.split(',').map(&:to_i)
    fail "データ不正:#{line}" if items.count != 3  # 3つの点数が記載させていなければエラー

    goukei = items.inject(0) { |a, e| a + e }
    max = goukei if max < goukei
    min = goukei if min > goukei
    sum += goukei
    count += 1
  end
end

puts "  sum = #{count}"
puts "count = #{count}"

sum = min = max = 0 if count == 0
puts "平均点 #{format('%3.2f', sum / count)}" if count > 0
puts "最低点 #{format('%3d', max)}"
puts "最低点 #{format('%3d', min)}"

実行例

$ cat data.txt
100, 90, 80
30,  40, 50

$ ruby aa.rb
  sum = 2
count = 2
平均点 195.00
最低点 270
最低点 120

$ cat  empty.txt

$ ruby aa.rb
  sum = 0
count = 0
最低点   0
最低点   0

items = line.chop.split(',').map(&:to_i)
goukei = items.inject(0) { |a, e| a + e }

が、よくわからなければ、つぎのように書いても同じです。

line.chop
items = line.split(',')
goukei = items[0].to_i + items[1].to_i + items[2].to_i

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/11 16:53

    ありがとうございました!!

    キャンセル

0

最初の所で、
max = 0ですね。なぜ100を代入したのでしょうか?
ロジックを振り返って考えると、初期値として、maxにはあり得る最大値以下の値、minにはあり得る最小値以上の値を入れる必要があります。

今回は全員が全教科0点だと三教科合計最大値が0ということがあり得るので、0以下の値を入れます。
minには、全員が全教科100点だと三教科合計最小値が300という事があり得るので、300以上の値を入れます。
一般的には、「この場合はこれで十分」といちいち判断しないなら、max = -Float::INFINITYmin = Float::INFINITYとします。

あと、
line = line.chomp!は、
line.chomp!もしくはline = line.chompと書くべきです。
普通は、それらをどちらも書かずに、
c = line.chomp.split(",")
でしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る