第一章
この本の内容を演習問題をメインにRubyに翻訳していくよ。
演習1,2は簡単すぎたので3から10まで。「続きを読む」クリックすれば最後まで出る。
著者の柴田さんにに許可とろうと思ったけど、有名人すぎるのか本にはアドレス公開してないしググると後援会HPにぶちあたる上ただの著者名としての引用にひっかかりまくるし、しまいに面倒くさくなってあきらめた。Web上に全解答公開してるし、ヘタレRubyに翻訳したバージョンくらい大丈夫だろう。訴えるなら訴えるがいいさ
…あ、えと、やっぱまずいなら連絡ほしいかなーとか
演習1-3 1からnまでの和を求める
def sum(n) sum = 0 sumstring = "" for i in 1..n #1..nはRange Object sum += i if i != 1 sumstring = sumstring + " + #{i.to_s}" else sumstring = "1" end end print "1からnまでの和\n" print sumstring, "=", sum end sum(rand(20))
演習1-4 2整数間の和を求める
def sumof(a,b) sum = 0 case a <=> b when 1 for i in b..a sum += i end when -1 for i in a..b sum += i end when 0 sum = 0 end return sum end a = rand(10) b = rand(10) print a, "と", b, "の間の整数の和は\n" p sumof(a,b)
演習1-5 正数の桁数を表示する
def digit(n) count = 0 d = nil while d != 0 d = n / 10 n = d count += 1 end return count end n = 134343 print n, "の桁数は", digit(n), "である\n"
演習1-6 2数の差を出すプログラム(ツッコミ機能付き)
#二回に分けて引数取るプログラムってRuby,できるんかな。 def subtra(a,b) if a > b print "第二引数は第一引数以上に設定してください\n" else print b, " - ", a, "は", b-a, "です\n" end end a, b = ARGV[0].to_i, ARGV[1].to_i ×puts subtra(a,b) →subtra(a,b) #最後にnil帰ってくる。何で?(´・ω・`)
id:secondlifeさんにご指摘いただきました。printの戻り値はnilなので、subtra method内でprintした結果をputs subtra(a,b)で表示してたからnilまで出てた。修正。
演習1-7 直角三角形4パターン、段数指定して作る関数
このプログラムでは、ARGVで取った引数を4つ、順に左下、左上、右上、右下直角の三角形の段数として設定している。実行は
$ ruby pra1-7.rb 3 5 3 6
てな感じ。ちなみにARGVはArrayで入ってくる。故にARGV.each{ }とかもいけちゃう。また、ARGVで取った中身はstringになっているため、数値として扱う時は.to_i忘れずに。
def trilb a = [] ARGV.each {|item| a << item.to_i } for i in 1..a[0] for j in 1..i print "*" end print "\n" end end def trilu a = [] ARGV.each {|item| a << item.to_i } for i in 1..a[1] for j in 1..(a[1]-i+1) print "*" end print "\n" end end #そういえば、RubyってStringを掛け算して繰り返し表示できた気がする… def triru a = [] ARGV.each {|item| a << item.to_i } for i in 1..a[2] print " " * (i-1), "*" * (a[2]-i+1), "\n" end end def trirb a = [] ARGV.each {|item| a << item.to_i } for i in 1..a[3] print " " * (a[3]-i), "*" * i, "\n" end end trilb print "\n\n" trilu print "\n\n" triru print "\n\n" trirb #ary作成繰り返しはもっとなんとかなりそうだけどまぁいいや
演習1-8 n段のピラミッドを作る関数
#土台は(n-1)*2+1個。必ず奇数になる。 def spira(n) max = (n-1) * 2 + 1 for i in 1..n m = (i-1) * 2 + 1 print " " * ((max-m)/2), "*" * m, "\n" end end spira(rand(20))
演習1-9 n段の数字ピラミッドを作る関数
def npira(n) max = (n-1) * 2 + 1 for i in 1..n m = (i-1) * 2 + 1 num = (i % 10).to_s #CやとStringにしたいときどうする? print " " * ((max-m)/2), num * m, "\n" end end npira(rand(20))
演習1-10 九九の表を作る
for i in 1..9 for j in 1..9 printf("%2d", i * j) print "|" unless j == 9 end print "\n" # print "-" * 26, "\n" まぁこの行は出力の好みで end