10の練習問題をやってみよう(二日目)

新しくプログラミング言語を覚えたいときに行うべき10の練習問題
実際にやってみよう。

第三問

複数の数値を入力させ、昇順に並び替え、最大値と最小値を出す(例:同僚の体重を入力して計算)。

昨日は「STDIN」っていう名前の定数を見つけたところまで。
午前中に書店で

プログラミングRuby 第2版 言語編

プログラミングRuby 第2版 言語編

↑の本を見つけたので衝動買いして、気がついたら100ページくらい一気に読んでしまった。くそー、面白いじゃないか。


この本によると、何も考えずに

gets

ってやると標準入力から一行読んでくることができるんだそうだ。ダンディを思い出した。ゲッツ!
しかしこれだけだと何のことやらさっぱりわからなくて不親切なので

STDIN.readline

って書いておいた方が分かりやすくて良いと思うなあ。


readlineメソッドを使って、繰り返し何度もユーザー入力を受け取るようなモノを書いてみよう。

loop do
  print "何か入力してね(何も入力しないでEnter押すと終わり)\n"
  print ">"
  input = STDIN.readline.chomp
  break if input.empty?
  print "#{input}」が入力されたよ\n"
end

うーん・・・「『gets』は主語がなくてわかりにくい」とか書いたけど、それを言うなら「print」もダメってことになるなぁ。
試しに主語をつけてみよう。

loop do
  STDOUT.print "何か入力してね(何も入力しないでEnter押すと終わり)\n"
  STDOUT.print ">"
  input = STDIN.readline.chomp
  break if input.empty?
  STDOUT.print "#{input}」が入力されたよ\n"
end

うーん・・・理屈としては「これでいいのだ」って感じなんだけど、さすがにコレは冗長な気がする。
STDINとSTDOUTを取っ払ってみよう。

loop do
  puts "何か入力してね(何も入力しないでEnter押すと終わり)"
  print ">"
  input = gets.chomp
  break if input.empty?
  puts "#{input}」が入力されたよ"
end

かなりスッキリした。いやいや、スッキリすればいいってもんじゃない。こんな初心者に優しくない書き方はダメだ。あー、でも、あそこ一行にまとまるなー。まとめたいなー。

loop do
  puts "何か入力してね(何も入力しないでEnter押すと終わり)"
  print ">"
  break if (input = gets.chomp).empty?
  puts "#{input}」が入力されたよ"
end

まとめてしまった

nums = []
loop do
  puts "数値を入力してね(何も入力しないでEnter押すと終わり)"
  print ">"
  break if (input = gets.chomp).empty?
  nums << Integer(input) rescue puts "バカ!"
end

puts "ソート:" + nums.sort.join(",")
puts "最大値:" + nums.max
puts "最小値:" + nums.min

できてしまった

思ったこと

オブジェクト指向プログラミング言語で「組み込み関数」なんてものは本来必要のないモノで、過去のしがらみに捕らわれた唾棄すべき忌々しいものだと思っていたけど、実際に使ってみると手軽で便利で使い心地が良い。頭ではダメだとわかっていても使いたくなってしまう。悪い女に騙されているような感じだ。