2011年3月24日木曜日

最近 Ruby の試験勉強をしています。

今度、Ruby の認定試験のシルバーを受けようとしています。
その練習。
きれいに書けた気がするので公開します。

このコードのポイントは、階乗の計算をするメソッドと
階乗の式を出力するメソッドを分けたところです。

私も初めは、両方の機能を一つのメソッド内に収める設計だった
のですが、それを分割することでプログラムが読みやすく
なっているのでは、ないかと思います。

読みやすいプログラムを記述するというのは、プログラマの
腕の見せ所です。

皆さんも読みやすいプログラムの記述を心がけてください。


if __FILE__ == $0

# ------------------------------------------
# exit が入力されるまで i の階乗を出力し続ける
# ------------------------------------------

# ******************************************
# calc_fractal
# ***
def calc_fractal(i)

if i == 1 then

return 1

else

return i * calc_fractal(i - 1)

end

end

# ******************************************
# fractal_expression
# ***
def fractal_expression(i)

if i == 1 then

return "1"

else

expression = i.to_s

return expression << " * "
+ fractal_expression(i - 1)

end

end

# //////////////////////////////////////////
# Main Process
# ///

i = 1

begin

puts fractal_expression(i) + " = "
+ calc_fractal(i).to_s

i += 1

puts "Please hit Enter key ! "
+ "if you want continue. "
+ "if not type 'exit'"

line = STDIN.gets.chop

end while line != "exit"

# //////////////////////////////////////////

end



-------------------------------------------------------------

出力は、こんな感じです。

1 = 1
Please hit Enter key ! if you want continue. if not type 'exit'

2 * 1 = 2
Please hit Enter key ! if you want continue. if not type 'exit'

3 * 2 * 1 = 6
Please hit Enter key ! if you want continue. if not type 'exit'

4 * 3 * 2 * 1 = 24
Please hit Enter key ! if you want continue. if not type 'exit'

5 * 4 * 3 * 2 * 1 = 120
Please hit Enter key ! if you want continue. if not type 'exit'

6 * 5 * 4 * 3 * 2 * 1 = 720
Please hit Enter key ! if you want continue. if not type 'exit'

7 * 6 * 5 * 4 * 3 * 2 * 1 = 5040
Please hit Enter key ! if you want continue. if not type 'exit'

8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 40320
Please hit Enter key ! if you want continue. if not type 'exit'

9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 362880
Please hit Enter key ! if you want continue. if not type 'exit'

10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 3628800
Please hit Enter key ! if you want continue. if not type 'exit'

11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 39916800
Please hit Enter key ! if you want continue. if not type 'exit'

12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 479001600
Please hit Enter key ! if you want continue. if not type 'exit'

13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 6227020800
Please hit Enter key ! if you want continue. if not type 'exit'

14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 87178291200
Please hit Enter key ! if you want continue. if not type 'exit'

15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 1307674368000
Please hit Enter key ! if you want continue. if not type 'exit'

16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 20922789888000
Please hit Enter key ! if you want continue. if not type 'exit'

17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 355687428096000
Please hit Enter key ! if you want continue. if not type 'exit'

18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 6402373705728000
Please hit Enter key ! if you want continue. if not type 'exit'

19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 121645100408832000
Please hit Enter key ! if you want continue. if not type 'exit'

20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 2432902008176640000
Please hit Enter key ! if you want continue. if not type 'exit'

21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 51090942171709440000
Please hit Enter key ! if you want continue. if not type 'exit'

22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 1124000727777607680000
Please hit Enter key ! if you want continue. if not type 'exit'

23 * 22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 25852016738884976640000
Please hit Enter key ! if you want continue. if not type 'exit'

24 * 23 * 22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 620448401733239439360000
Please hit Enter key ! if you want continue. if not type 'exit'

25 * 24 * 23 * 22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 15511210043330985984000000
Please hit Enter key ! if you want continue. if not type 'exit'

26 * 25 * 24 * 23 * 22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 403291461126605635584000000
Please hit Enter key ! if you want continue. if not type 'exit'

27 * 26 * 25 * 24 * 23 * 22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 10888869450418352160768000000
Please hit Enter key ! if you want continue. if not type 'exit'

28 * 27 * 26 * 25 * 24 * 23 * 22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 304888344611713860501504000000
Please hit Enter key ! if you want continue. if not type 'exit'

29 * 28 * 27 * 26 * 25 * 24 * 23 * 22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 8841761993739701954543616000000
Please hit Enter key ! if you want continue. if not type 'exit'

30 * 29 * 28 * 27 * 26 * 25 * 24 * 23 * 22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 265252859812191058636308480000000
Please hit Enter key ! if you want continue. if not type 'exit'

31 * 30 * 29 * 28 * 27 * 26 * 25 * 24 * 23 * 22 * 21 * 20 * 19 * 18 * 17 * 16 * 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 8222838654177922817725562880000000
Please hit Enter key ! if you want continue. if not type 'exit'
exit

ここまでやって疑問。。。。階乗って、×でいいんだっけ?

それとこのプログラムが間違っているかどうかの問題。

私の立場は、

・読みにくいがバグがないプログラム



・バグはあるかもしれないが、読みやすいプログラム

では、

後者を支持します。

なので、このプログラムにバグがないことは、保証しません。

それは、保証できないわけではありません。

私は、プログラムにバグがないことを保証するプロセスは、

計画的なテストによって解決すると考えています。

今回は、保証しない方針なので、計画的なテストとか、

そういう堅苦しいことは、していません。

このソースコードは、プログラミングという仕事が好きな人と

楽しみを共有するためのものです。

なのでバグがあったら恥ずかしいですが、

恥ずかしいからと言って、公開しないという選択肢は、

選びません。

私のブログは、プログラミングを仕事としているすべての人が

楽しく仕事をするための活動の一環です。

以上!

2 件のコメント:

den さんのコメント...

もうひとつ気づいたこと。

階乗って、結果の一の位がゼロになるんだね、数が増えると。

den さんのコメント...

10とか20をかけてるから当たり前か。。。汗。