提出課題: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