提出課題:04回目レポート
本文:
1.
(1)を2番までしました
2.
#!/usr/koeki/bin/ruby
# -*- coding: utf-8 -*-
require 'kconv'
soft = Hash.new
File.open("softball.txt","r:utf-8") do |mo|
while line = mo.gets
  if /(\S+)\s+(\d+)\s+(\d+)\s+(\d+)/ =~ line
    
    soft[$1] = [$2.to_f,$3.to_f,$4,$2.to_f/($2.to_f + $3.to_f)]
    
  end
end
end
print"何に基づいて並び替えをしますか?\n"
print"勝ち数 = 1, 負け数 = 2, 引き分け数 = 3, 勝率 = 4\n"
what = gets.chomp!.to_i
print"昇順したい場合 = 1, 降順したい場合 = 2 を入力してください。\n"
how = gets.chomp!.to_i
print"--チーム名------------+-勝ち-+-負け-+-引分--+-勝率---\n"
if what == 1 && how == 1
  for team in soft.keys.sort {|a, b| soft[a][0] <=> soft[b][0]}
  result =  sprintf("%-25s%d%7d%7d%12.3f\n",
              team.toeuc.force_encoding("binary"),
              soft[team][0], soft[team][1], soft[team][2],
              soft[team][0]/(soft[team][0]+soft[team][1])).toutf8
  puts result
  end
  
  
  elsif what == 1 && how == 2
  
  for team in soft.keys.sort {|a, b| soft[b][0] <=> soft[a][0]}
  result =  sprintf("%-25s%d%7d%7d%12.3f\n",
              team.toeuc.force_encoding("binary"),
              soft[team][0], soft[team][1], soft[team][2],
              soft[team][0]/(soft[team][0]+soft[team][1])).toutf8
  puts result
  end
  
  
  elsif what == 2 && how == 1
    for team in soft.keys.sort {|a, b| soft[a][1] <=> soft[b][1]}
  result =  sprintf("%-25s%d%7d%7d%12.3f\n",
              team.toeuc.force_encoding("binary"),
              soft[team][0], soft[team][1], soft[team][2],
              soft[team][0]/(soft[team][0]+soft[team][1])).toutf8
  puts result
    end
  
  elsif what == 2 && how == 2
  
  for team in soft.keys.sort {|a, b| soft[b][1] <=> soft[a][1]}
  result =  sprintf("%-25s%d%7d%7d%12.3f\n",
              team.toeuc.force_encoding("binary"),
              soft[team][0], soft[team][1], soft[team][2],
              soft[team][0]/(soft[team][0]+soft[team][1])).toutf8
  puts result
  end
  elsif what == 3 && how == 1
    for team in soft.keys.sort {|a, b| soft[a][2] <=> soft[b][2]}
  result =  sprintf("%-25s%d%7d%7d%12.3f\n",
              team.toeuc.force_encoding("binary"),
              soft[team][0], soft[team][1], soft[team][2],
              soft[team][0]/(soft[team][0]+soft[team][1])).toutf8
  puts result
    end
    elsif what == 3 && how == 2
  
  for team in soft.keys.sort {|a, b| soft[b][2] <=> soft[a][2]}
  result =  sprintf("%-25s%d%7d%7d%12.3f\n",
              team.toeuc.force_encoding("binary"),
              soft[team][0], soft[team][1], soft[team][2],
              soft[team][0]/(soft[team][0]+soft[team][1])).toutf8
  puts result
  end
    elsif what == 4 && how == 1
      for team in soft.keys.sort {|a, b| soft[a][3] <=> soft[b][3]}
 result =  sprintf("%-25s%d%7d%7d%10.3f\n",
               team.toeuc.force_encoding("binary"),
               soft[team][0], soft[team][1], soft[team][2],
               soft[team][0]/(soft[team][0]+soft[team][1])).toutf8
  puts result
      end
    else
      for team in soft.keys.sort {|a, b| soft[b][3] <=> soft[a][3]}
  result =  sprintf("%-25s%d%7d%7d%12.3f\n",
              team.toeuc.force_encoding("binary"),
              soft[team][0], soft[team][1], soft[team][2],
              soft[team][0]/(soft[team][0]+soft[team][1])).toutf8
  puts result
  end
     
end
3.
実行結果1
何に基づいて並び替えをしますか?
勝ち数 = 1, 負け数 = 2, 引き分け数 = 3, 勝率 = 4
1
昇順したい場合 = 1, 降順したい場合 = 2 を入力してください。
1
--チーム名------------+-勝ち-+-負け-+-引分--+-勝率---
クリケッツ               50     83      3       0.376
スネイルズ               52     82      2       0.388
モスキートーズ           65     65      6       0.500
ブックウォームス         75     52      9       0.591
ドラゴンフライズ         77     51      8       0.602
アンツ                   78     53      5       0.595
実行結果2
何に基づいて並び替えをしますか?
勝ち数 = 1, 負け数 = 2, 引き分け数 = 3, 勝率 = 4
4
昇順したい場合 = 1, 降順したい場合 = 2 を入力してください。
1
--チーム名------------+-勝ち-+-負け-+-引分--+-勝率---
クリケッツ               50     83      3     0.376
スネイルズ               52     82      2     0.388
モスキートーズ           65     65      6     0.500
ブックウォームス         75     52      9     0.591
アンツ                   78     53      5     0.595
ドラゴンフライズ         77     51      8     0.602
4.
(4)文字コードを変換をするkconvを呼び出す
(6)softはハッシュであることを表す
(8~10)open メゾットでファイルを開き、必要な情報を出す
(12)(8)で出した情報をsoftの配列に代入する
         配列最後の$2.to_f/($2.to_f + $3.to_f)は勝率でも並び替えができるように付け加えた
(20~24)何でどのように並び替えをするか入力してもらう
{
(33)上記の質問で1(勝ち数)かつ、1(昇順)を選んだ場合
(35)配列のバリュー0番目(勝ち数)をsortを使って昇順に並び替える
(37~40)いろいろ文字コードを変換したあと、最後にute-8に戻してresult に代入する
}
あとは{  }の説明と同様、それぞれ対応して表示されるようにした
5.
勝率で並び替えができるようにするのが一番難しく、プログラムの中身を一つずつ理解をしてやっとわかった。
最初はsortの[]の中を%dなどにして、一つで対応できるようにしたかったが、よくわからないエラーが起きてしまったので、if を使ってそれぞれに対応させて表示させた。プログラムがとても長くなってしまったので、解決方法があれば知りたいです。
添付:
softball2.rb