08
25
Ruby練習問題 その1 解答例
2013.08.25(20:29)
Ruby練習問題 その1 解答例
Ruby練習問題 その1 解答例
「初心者向け解答」例をこしらえました。短くトリッキーな解答ではなく、長くても理解しやすく応用がききやすいものにしました。
「初心者向け解答」例をこしらえました。短くトリッキーな解答ではなく、長くても理解しやすく応用がききやすいものにしました。
# encoding: Shift_JIS =begin Ruby練習問題 その1 (正規表現,配列,ファイル) =end # ヒント printf "整数の配列\n" array = [100,20,3] p array p array.sort p "50" p "50".to_i * 2 printf "文字列の配列\n" array = Array.new array << "100" array << "20" array << "3" p array p array.sort p array.sort{|a,b| a.to_i <=> b.to_i} # ファイルを書く file_name = 'data.txt' File.open(file_name,"w") { |f| f.puts "square,40,5" # 幅,高さ f.puts "square,30,20" f.puts "circle,100" # 半径 f.puts "triangle,20,10" # 底辺,高さ f.puts "circle,20" f.puts "circle,3" f.puts "circle,3" # 半径3は2つある f.puts "square,8,15" } printf "ファイルを読んでそのまま出力する\n" File.open(file_name,"r") { |f| while line = f.gets puts line end } printf "ファイルを読んで、circleを含む行だけを出力する\n" File.open(file_name,"r") { |f| while line = f.gets if /circle/ =~ line puts line end end } printf "ファイルを読んで、circleを含む行を、circle,半径,面積 と出力する\n" # rubyでの円周率はググる。 File.open(file_name,"r") { |f| while line = f.gets if /circle,(\d+)/ =~ line hankei = $1.to_i menseki = hankei * hankei * Math::PI printf "circle,#{hankei},#{menseki}\n" end end } printf "ファイルを読んで、circleを含む行を、半径の小さい順に、circle,半径 と出力する\n" zukei = 'circle' array = Array.new File.open(file_name,"r") { |f| while line = f.gets if /#{zukei},(\d+)/ =~ line hankei = $1.to_i array << hankei end end } array.sort.each { |hankei| printf "#{zukei},#{hankei}\n" } printf "ファイルを読んで、circleを含む行を、半径の小さい順に、circle,半径 と出力する[別解]\n" zukei = 'circle' array = Array.new File.open(file_name,"r") { |f| while line = f.gets if /#{zukei},(\d+)/ =~ line array << line.chomp end end } array.sort{ |line1,line2| hankei1 = line1.scan(/#{zukei},(\d+)/)[0][0].to_i hankei2 = line2.scan(/#{zukei},(\d+)/)[0][0].to_i hankei1 <=> hankei2 }.each { |line| puts "#{line}" } printf "ファイルを読んで、squareを含む行を、square,高さ,幅 と出力する (幅と高さを逆に出力)\n" File.open(file_name,"r") { |f| while line = f.gets if /(\w+),(\d+),(\d+)/ =~ line zukei, haba, takasa = $1,$2,$3 if zukei == 'square' printf "#{zukei},#{takasa},#{haba}\n" end end end } printf "ファイルを読んで、全部の行について、行全体,面積 と出力する\n" File.open(file_name,"r") { |f| while line = f.gets line.chomp! array = line.split(/,/) zukei = array.shift array.map!{ |s| s.to_i } case zukei when 'square' haba,takasa = array[0..1] menseki = haba * takasa when 'circle' hankei = array[0] menseki = hankei * hankei * Math::PI when 'triangle' teihen,takasa = array[0..1] menseki = teihen * takasa / 2 else raise "undefined #{zukei}\n" end printf "%-14s,%3.2f\n",line,menseki end }実行結果 (Ruby2.0.0)
整数の配列 [100, 20, 3] [3, 20, 100] "50" 100 文字列の配列 ["100", "20", "3"] ["100", "20", "3"] ["3", "20", "100"] ファイルを読んでそのまま出力する square,40,5 square,30,20 circle,100 triangle,20,10 circle,20 circle,3 circle,3 square,8,15 ファイルを読んで、circleを含む行だけを出力する circle,100 circle,20 circle,3 circle,3 ファイルを読んで、circleを含む行を、circle,半径,面積 と出力する circle,100,31415.926535897932 circle,20,1256.6370614359173 circle,3,28.274333882308138 circle,3,28.274333882308138 ファイルを読んで、circleを含む行を、半径の小さい順に、circle,半径 と出力する circle,3 circle,3 circle,20 circle,100 ファイルを読んで、circleを含む行を、半径の小さい順に、circle,半径 と出力する[別解] circle,3 circle,3 circle,20 circle,100 ファイルを読んで、squareを含む行を、square,高さ,幅 と出力する (幅と高さを逆に出力) square,5,40 square,20,30 square,15,8 ファイルを読んで、全部の行について、行全体,面積 と出力する square,40,5 ,200.00 square,30,20 ,600.00 circle,100 ,31415.93 triangle,20,10,100.00 circle,20 ,1256.64 circle,3 ,28.27 circle,3 ,28.27 square,8,15 ,120.00