9章 メソッドの作り方に提示される練習問題に応じた アラビア数字を引数として、ローマ数字を返り値とせよ は前編、課題として残したが後篇なる
9.1 メソッド引数
9.2 局所変数
9.3 返り値
9.4 練習問題
やがてある人が、小さい数を大きい数の前に入れて、 小さい数を引き算するようにすれば、すさまじく便利なことに気が付きました。 この発展の結果、今ここで、あなたはてこずることになります。 先のメソッドを新しいタイプのローマ数字の文字列を返すように書き換えてみましょう。と云うものにて、前編と同様にヒントとして与えられるのが次の引用なれば
整数の割り算と余り演算子を使います。また参考のため、ローマ数字で使われる文字を挙げておきます。即ち roman_numeral 4 に対し、前回は IIII と返したを、今回は IV と返されるを想定するのが 新しいローマ数字 の課題に、今回は此方への当方の解答例を贄に供すべく思います。
I=1 V=5 X=10 L=50 C=100 D=500 M=1000
スポンサーリンク
def show_place btm_fig, mid_fig, upp_fig, num
if num <= 2
return btm_fig ∗ num
elsif num <= 4
return btm_fig ∗ (5 - num) + mid_fig
elsif num == 5
return mid_fig
elsif num <= 7
return mid_fig + btm_fig ∗ (num - 5)
else
return btm_fig ∗ (10 - num) + upp_fig
end
end
def roman_numeral num
fourth_place = num / 1000
third_place = (num % 1000) / 100
second_place = (num % 100) / 10
first_place = num % 10
´M´∗fourth_place
+ show_place(´C´,´D´,´M´,third_place)
+ show_place(´X´,´L´,´C´,second_place)
+ show_place(´I´,´V´,´X´,first_place)
end
puts ´1~3000迄の数字を入力してください。´
puts ´入力された数字をローマ数字に変換します。´
ip_num = gets.chomp.to_i
puts roman_numeral(ip_num)
にてご覧の通り、入力値チェックは実装していないのはご了承あられ度も、
本体なるはメインルーチン
roman_numeral
で桁分けをした夫々の桁表示を
show_place
に委託するに当該数字をヒント所与のローマ数字と共に引数として渡しています。
if num <= 2
return btm_fig ∗ num
elsif num <= 4
return btm_fig ∗ (5 - num) + mid_fig
elsif num == 5
return mid_fig
elsif num <= 7
return mid_fig + btm_fig ∗ (num - 5)
else
return btm_fig ∗ (10 - num) + upp_fig
end
end
def roman_numeral num
fourth_place = num / 1000
third_place = (num % 1000) / 100
second_place = (num % 100) / 10
first_place = num % 10
´M´∗fourth_place
+ show_place(´C´,´D´,´M´,third_place)
+ show_place(´X´,´L´,´C´,second_place)
+ show_place(´I´,´V´,´X´,first_place)
end
puts ´1~3000迄の数字を入力してください。´
puts ´入力された数字をローマ数字に変換します。´
ip_num = gets.chomp.to_i
puts roman_numeral(ip_num)
上記プログラムを、現在の手元環境
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
で走らせて得られる結果は、先ずは所与の4に於いては
C:¥tsukamotch¥Ruby¥programs
>ruby roman_numeral.rb
1~3000迄の数字を入力してください。
入力された数字をローマ数字に変換します。
4
IV
と、取敢えずは想定した儘の結果
IIII
を得られ、また限界値3000でも
>ruby roman_numeral.rb
1~3000迄の数字を入力してください。
入力された数字をローマ数字に変換します。
4
IV
C:¥tsukamotch¥Ruby¥programs
>ruby roman_numeral.rb
1~3000迄の数字を入力してください。
入力された数字をローマ数字に変換します。
3000
MMM
任意の数字1289でも
>ruby roman_numeral.rb
1~3000迄の数字を入力してください。
入力された数字をローマ数字に変換します。
3000
MMM
C:¥tsukamotch¥Ruby¥programs
>ruby roman_numeral.rb
1~3000迄の数字を入力してください。
入力された数字をローマ数字に変換します。
1289
MCCXXCIX
の様に想定の結果が得られる様ですが、
多少力技の感の無きにしも非ず、
次章、第10章では
再帰
を学習の予定なれば、
其の後当該手法を用いたコードを供し度予定しています。
>ruby roman_numeral.rb
1~3000迄の数字を入力してください。
入力された数字をローマ数字に変換します。
1289
MCCXXCIX
扠、実は上記今回の贄コードに辿り着くには多少の紆余曲折有るは
def roman_numeral num
m_num = num ⁄ 1000
d_num = (num % 1000) ⁄ 500
c_num = (num % 500) ⁄ 100
if d_num == 1
if c_num == 3
c_num = 0
cd_num = 2
elsif c_num == 4
c_num = 0
cd_num = 1
else
cd_num = 0
end
else
if c_num == 3
c_num = 0
d_num = 1
cd_num = 2
elsif c_num == 4
c_num = 0
d_num = 1
cd_num = 1
else
cd_num = 0
end
end
l_num = (num % 100) ⁄ 50
x_num = (num % 50) ⁄ 10
if l_num == 1
if x_num == 3
x_num = 0
xl_num = 2
elsif x_num == 4
x_num = 0
xl_num = 1
else
xl_num = 0
end
else
if x_num == 3
x_num = 0
l_num = 1
xl_num = 2
elsif x_num == 4
x_num = 0
l_num = 1
xl_num = 1
else
xl_num = 0
end
end
v_num = (num % 10) ⁄ 5
i_num = num % 5
if v_num == 1
if i_num == 3
i_num = 0
iv_num = 2
elsif i_num == 4
i_num = 0
iv_num = 1
else
iv_num = 0
end
else
if i_num == 3
i_num = 0
v_num = 1
iv_num = 2
elsif i_num == 4
i_num = 0
v_num = 1
iv_num = 1
else
iv_num = 0
end
end
show_num = (´M´∗m_num)
   +(´C´∗cd_num)
   +(´D´∗d_num)
   +(´C´∗c_num)
   +(´X´∗xl_num)
   +(´L´∗l_num)
   +(´X´∗x_num)
   +(´I´∗iv_num)
   +(´V´∗v_num)
   +(´I´∗i_num)
end
puts ´1~3000迄の数字を入力してください。´
puts ´入力された数字をローマ数字に変換します。´
ip_num = gets.chomp.to_i
puts roman_numeral(ip_num)
には重大なるバグの存ぜば、
さあご用とお急ぎでない方は頂戴、見て頂戴。
m_num = num ⁄ 1000
d_num = (num % 1000) ⁄ 500
c_num = (num % 500) ⁄ 100
if d_num == 1
if c_num == 3
c_num = 0
cd_num = 2
elsif c_num == 4
c_num = 0
cd_num = 1
else
cd_num = 0
end
else
if c_num == 3
c_num = 0
d_num = 1
cd_num = 2
elsif c_num == 4
c_num = 0
d_num = 1
cd_num = 1
else
cd_num = 0
end
end
l_num = (num % 100) ⁄ 50
x_num = (num % 50) ⁄ 10
if l_num == 1
if x_num == 3
x_num = 0
xl_num = 2
elsif x_num == 4
x_num = 0
xl_num = 1
else
xl_num = 0
end
else
if x_num == 3
x_num = 0
l_num = 1
xl_num = 2
elsif x_num == 4
x_num = 0
l_num = 1
xl_num = 1
else
xl_num = 0
end
end
v_num = (num % 10) ⁄ 5
i_num = num % 5
if v_num == 1
if i_num == 3
i_num = 0
iv_num = 2
elsif i_num == 4
i_num = 0
iv_num = 1
else
iv_num = 0
end
else
if i_num == 3
i_num = 0
v_num = 1
iv_num = 2
elsif i_num == 4
i_num = 0
v_num = 1
iv_num = 1
else
iv_num = 0
end
end
show_num = (´M´∗m_num)
   +(´C´∗cd_num)
   +(´D´∗d_num)
   +(´C´∗c_num)
   +(´X´∗xl_num)
   +(´L´∗l_num)
   +(´X´∗x_num)
   +(´I´∗iv_num)
   +(´V´∗v_num)
   +(´I´∗i_num)
end
puts ´1~3000迄の数字を入力してください。´
puts ´入力された数字をローマ数字に変換します。´
ip_num = gets.chomp.to_i
puts roman_numeral(ip_num)
再帰プログラム入門
初めてのプログラミング懇切丁寧、微に入り細を穿ちて著されればRuby及びプログラミングの両者が目的に共に入門書としてお誂え向きとて愛読の初めてのプログラミングの各章の最後に設けられた練習問題では正解の掲載されぬを、幾許か不安を感じるも在り哉無し哉、共に本誌を