モノノフ日記

普通の日記です

rubyチュートリアルを試してみる その2

id:Kiske:20070704:1183536597の続きです。4〜6章です。

プログラミング入門 - Rubyを使って -, by Chris Pine, 日本語ver. by S. Nishiyama

数と文字列の変換

型変換の話です。PHPだと勝手に型変換もしてくれてたけどRubyは明示的にする必要あり(こっちのが好みだけど)

練習問題
  • 最初に姓、次に名前を聞いて、最後にフルネームに対してあいさつをするようなプログラムを書いてみましょう。
puts '名字を入力してね'
lastname = gets.chomp
puts '名前を入力してね'
firstname = gets.chomp
puts '君の名前は ' + lastname + firstname + 'だね。こんにちは。'
  • 好きな数を入力してもらい、それに1を加えて、その結果を ベターな 数字として薦めるプログラムを書きましょう。 (機転の利いたサジェスチョンに努めましょう。)
puts '頭に浮かんだ数字を入力してね'
number = gets.chomp.to_i
puts '今日の君のラッキーナンバーは ' + (number+1).to_s + ' はだよ!'

機転の利いたサジェスチョン、になってるかは不明(;^ω^)

メソッド(method)

Rubyは宣言した物全てがオブジェクトとして扱われるんで、
宣言したオブジェクトの後に「.hogehoge」みたいな感じで定義済みメソッドが呼べるみたい。
頭に何にもつけないputsやgetsはselfオブジェクトに属してるから省略可能らしい。

練習問題
  • 「怒ったボス」のプログラムを書いてみましょう。まず、無作法に何が望みか聞いてきます。で、何を答えようと「怒ったボス」はそれを叫び返して、あなたを首にします。たとえば、もし給料上げてくださいとタイプしたとすると なにぃ? "給料上げてください" だとー!! おまえは首だ!! と、叫び返してきます。
puts '希望を言ってみたまえ。'
hope = gets.chomp
puts 'なにぃ? "' + hope + '" だとぉー!おまえは首だ!!'
  • center, ljust, そして rjust を使ってもう少し何かやってみましょう。こんな感じの「目次」を表示するプログラムを書いてみてください。
lineWidth = 40
title = '目次'
puts title.center(lineWidth)
puts '1章: 数'.ljust(lineWidth) + 'p. 1'.ljust(lineWidth)
puts '2章: 文字'.ljust(lineWidth) + 'p. 72'.ljust(lineWidth)
puts '3章: 変数'.ljust(lineWidth) + 'p. 118'.ljust(lineWidth)

制御構造

比較演算子やifとかwhileのような条件文について書かれてました。
論理演算子がandやor, notってのは可読性がいいな、と思ったらPHPも同じように書けるみたい(PHP: 論理演算子 - Manual)

練習問題

なんか急にボリュームが増えてます。

  • "99本のビールが壁に..." 遠足などでよく歌われる古典的な童謡の歌詞、"99 Bottles of Beer on the Wall" を出力するプログラムを書いてみましょう。(訳註:マザーグースの歌なのですが、日本ではあまりメジャーではないので、出力例をあげておきます。)
bottles = 99
while bottles > 0
    puts bottles.to_s + ' Bottles of beer on the wall'
    puts bottles.to_s + ' Bottles of beer'
    puts 'Take one down and pass it around'
    bottles = bottles - 1
    puts bottles.to_s + ' Bottles of beer on the wall'
    puts ''
end
  • 耳の遠いおばあちゃんのプログラムを書いてみましょう。おばあちゃんに何を言っても(何をタイプしても)、叫ばない限り (つまり、全部大文字でタイプしない限り)、 は?! もっと大きな声で話しておくれ、坊や! と返事をします。もし叫んだときは、彼女はあなたの言葉を聞いて (少なくとも聞いた気がして)、 いやー、1938年以来ないねー! と大声で返事をします。プログラムにちょっと真実味 を持たせるため、 1930年から1950年のランダムな数字で毎回違う年を叫ぶようにしましょう。 (この部分はオプションです。メソッドの章で、Rubyの乱数発生法の節を読んでいたら簡単でしょう。) あなたはBYEと叫ぶまでおばあちゃんとの会話から逃れられません。
command = ''
while command.upcase != 'BYE'
    if (command == command.upcase and command != '')
        year = 1930 + rand(21)
        puts "いやー、" + year.to_s + '年以来来ないねー!'
    else
        puts 'は?! もっと大きな声で話しておくれ、坊や!'
    end
    command = gets.chomp
end
  • 上で作った、「耳の遠いおばあちゃんのプログラム」を拡張しましょう。おばあちゃんはあなたに行って欲しくないのです。あなたがBYEと叫んでもおばあちゃんは聞こえないふりをします。 BYEを3回連続で 叫ばないといけないように変更してみてください。 BYEと3回叫んでも連続していない限り、おばあちゃんとの会話は続くようになっているかプログラムをテストして確認してみましょう。
command = ''
while command.upcase != 'BYE'
    if (command == command.upcase and command != '')
        year = 1930 + rand(21)
        puts "いやー、" + year.to_s + '年以来来ないねー!'
    else
        puts 'は?! もっと大きな声で話しておくれ、坊や!'
    end
    command = gets.chomp
    if(command.upcase == 'BYE')
        command = gets.chomp
        if(command.upcase == 'BYE')
            command = gets.chomp
        end
    end
end
  • うるう年。 開始の年と終わりの年を聞いて、その間にあるすべてのうるう年を (もし開始や終了の年がうるう年だったらそれも含めて)表示するプログラムを書きましょう。うるう年は(1984年とか2004年のように)4で割り切れる数の年です。ただし、100で割り切れる年はうるう年ではなくて (たとえば1800年や1900年)、さらに、それは 400で割り切れない限り です。(つまり、1600年や2000年はうるう年です。) (確かに、このルールは紛らわしいです。でも7月が冬の真ん中に来てしまうのはもっと紛らわしいと思いませんか?このルールがなかったらそうなったかもしれないのです。)
puts '開始年を入力.'
from = gets.chomp.to_i

puts '終了年を入力.'
to = gets.chomp.to_i

puts "#{from}年〜#{to}年のうるう年一覧"
while from <= to
    if (from % 4 == 0 and from % 100 != 0 or from % 400 == 0)
        puts from.to_s + ''
    end
    from = from + 1
end

長くなってきたのでとりあえず今日はここまで。