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