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
 
プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示