【Ruby】レッスン4-☆2:アラビア数字をローマ数字に変換しよう

一つ前のページではナインゲームを作成しました。
今回は アラビア数字をローマ数字に変換 するコードを書いてみましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:メソッド編
Lesson4:コレクション編
・Lesson4-1:配列の基本を理解しよう
・Lesson4-2:配列を操作しよう
・Lesson4-3:配列を調査しよう
・Lesson4-4:配列を並び替えよう
・Lesson4-5:eachメソッドを理解しよう
・Lesson4-6:mapメソッドを理解しよう
・Lesson4-7:filterメソッドを理解しよう
・Lesson4-8:ハッシュを理解しよう
・確認問題4-☆1:ナインゲームを作ろう
・確認問題4-☆2:アラビア数字をローマ数字に変換しよう ◁今回はココ
・確認問題4-☆3:トランプをランダムに配ろう
Lesson5:オブジェクト指向編
確認問題|アラビア数字からローマ数字への変換プログラムに挑戦しよう

アラビア数字をローマ数字に変換するプログラムを作成しましょう。
ユーザーが1から3999までの数字を入力すると、その数字に対応するローマ数字が出力されるようにします。
なお、作成するメソッド内で以下のローマ数字の対応表を使用すること。
1000 => "M", 900 => "CM", 500 => "D", 400 => "CD", 100 => "C", 90 => "XC", 50 => "L", 40 => "XL", 10 => "X", 9 => "IX", 5 => "V", 4 => "IV", 1 => "I"
以下の要件に従ってコードを完成させてください。
- アラビア数字をローマ数字に変換するメソッド
convert_to_roman
を定義すること。 - このメソッドは引数としてアラビア数字(整数)を受け取り、その整数に対応するローマ数字を文字列で返すこと。
- ユーザーに1から3999の間の整数を入力させること。
- 入力値をメソッド
convert_to_roman
に渡し、ローマ数字に変換すること。 - 結果を画面に表示すること。
ただし、以下のような実行結果となるコードを書くこと。
アラビア数字を入力してください(1から3999の間): 1987 ローマ数字: MCMLXXXVII
【ヒント】自力で解くのが難しい人へ
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1:メソッド
convert_to_roman
の定義
□ ハッシュroman_map
にローマ数字の対応表を降順で設定
□ 空の文字列roman_numeral
を初期化
□roman_map
を繰り返し処理
□ □ while文でnumber
が現在のキー以上である間、ローマ数字を連結
□ □ □ ローマ数字をroman_numeral
に追加
□ □ □number
からキーの値を減算2:
if __FILE__ == $0
でメイン処理を定義
□ 「アラビア数字を入力してください(1から3999の間)」と出力
□ 入力値を整数型に変換して変数number
に代入
□ メソッドconvert_to_roman
を呼び出して結果を変数roman_numeral
に代入
□ 「ローマ数字: 」とローマ数字の変換結果を出力
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# アラビア数字をローマ数字に変換するメソッド def convert_to_roman(number) # ローマ数字の対応を降順で設定 =begin 【穴埋め問題1】 ここにローマ数字の対応表をハッシュ形式で降順に設定するコードを書いてください。 =end roman_numeral = "" # ローマ数字の対応を繰り返し処理でチェックしながら変換 =begin 【穴埋め問題2】 ここでeachメソッドを使って、対応表のキーと値を順番に処理するコードを書いてください。 =end roman_numeral end # メイン処理 if __FILE__ == $0 # ユーザーにアラビア数字を入力させる puts "アラビア数字を入力してください(1から3999の間):" =begin 【穴埋め問題3】 ここでgetsメソッドを使って、ユーザー入力を整数に変換し、変数numberに代入するコードを書いてください。 =end # 入力された数字をローマ数字に変換する =begin 【穴埋め問題4】 ここでconvert_to_romanメソッドを呼び出し、ローマ数字に変換して変数roman_numeralに代入するコードを書いてください。 =end # 結果を出力する puts "ローマ数字: #{roman_numeral}" end
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
この問題の解答例と解説
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
# アラビア数字をローマ数字に変換するメソッド def convert_to_roman(number) # ローマ数字の対応を降順で設定 roman_map = { 1000 => "M", 900 => "CM", 500 => "D", 400 => "CD", 100 => "C", 90 => "XC", 50 => "L", 40 => "XL", 10 => "X", 9 => "IX", 5 => "V", 4 => "IV", 1 => "I" } roman_numeral = "" # ローマ数字の対応を繰り返し処理でチェックしながら変換 roman_map.each do |key, value| while number >= key roman_numeral << value number -= key end end roman_numeral end # メイン処理 if __FILE__ == $0 # ユーザーにアラビア数字を入力させる puts "アラビア数字を入力してください(1から3999の間):" number = gets.to_i # 入力された数字をローマ数字に変換する roman_numeral = convert_to_roman(number) # 結果を出力する puts "ローマ数字: #{roman_numeral}" end
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
ローマ数字への変換メソッドの定義
def convert_to_roman(number) roman_map = { 1000 => "M", 900 => "CM", 500 => "D", 400 => "CD", 100 => "C", 90 => "XC", 50 => "L", 40 => "XL", 10 => "X", 9 => "IX", 5 => "V", 4 => "IV", 1 => "I" } roman_numeral = ""
def convert_to_roman(number)
: メソッドの定義です。convert_to_roman
は入力されたアラビア数字をローマ数字に変換する機能を持ちます。number
はメソッドの引数で、ユーザーが変換したい数字を指定します。roman_map
: ローマ数字の対応表(マッピング)をハッシュとして定義しています。
キーはアラビア数字(例: 1000)、値は対応するローマ数字(例: “M”)です。roman_numeral = ""
: 結果となるローマ数字を格納するための変数を初期化します。最初は空の文字列です。
ローマ数字への変換ロジック
roman_map.each do |key, value| while number >= key roman_numeral << value number -= key end end roman_numeral end
roman_map.each do |key, value|
: ハッシュroman_map
の各要素(キーと値のペア)を順に処理します。
例えばキー1000
と値"M"
を取り出し、変換処理を行います。while number >= key
: アラビア数字number
が現在のキーkey
以上の場合、この処理を繰り返します。
例えばnumber
が1500で、キーが1000の場合、この処理を1回実行します。roman_numeral << value
: 対応するローマ数字value
をroman_numeral
に追加します。
例えばキーが1000の場合、"M"
が追加されます。number -= key
: アラビア数字number
からキーkey
の値を引きます。
これにより、ローマ数字に変換済みの部分を取り除きます。
メイン処理部分
if __FILE__ == $0 puts "アラビア数字を入力してください(1から3999の間):" number = gets.to_i roman_numeral = convert_to_roman(number) puts "ローマ数字: #{roman_numeral}" end
if __FILE__ == $0
: Rubyプログラムのエントリーポイントを指定します。このコードは、スクリプトとして実行された場合にのみ実行されます。puts "アラビア数字を入力してください(1から3999の間):"
: ユーザーにアラビア数字の入力を求めるメッセージを表示します。number = gets.to_i
: ユーザーが入力した値を取得し、整数型(to_i
)に変換して変数number
に格納します。roman_numeral = convert_to_roman(number)
: 入力されたアラビア数字をローマ数字に変換するために、convert_to_roman
メソッドを呼び出します。puts "ローマ数字: #{roman_numeral}"
: 変換結果のローマ数字を表示します。
まとめ
このプログラムではRubyの基礎文法を学ぶことができます。特に以下の点が重要です。
- ハッシュを使用してデータを管理する方法。
- メソッドの定義と引数の利用。
- **繰り返し処理(eachやwhile)**の活用。
実際にコードを実行し、さまざまな数字を入力してローマ数字に変換してみましょう。
Rubyの基本的な書き方とロジック構築の理解が深まります。ぜひ他の変換ルールや改良案も試してみてください!