--

--

スポンサーサイト

--.--.--(--:--)

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

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リンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。