【Ruby】確認問題4-☆2:アラビア数字をローマ数字に変換しよう

記事内に商品プロモーションを含む場合があります

この記事の練習問題で使用する知識:
基礎文法(レッスン1)比較演算子と論理演算子while文による繰り返し処理メソッドの定義と使用eachメソッドハッシュ

<<前のページ Ruby記事一覧 次のページ>>

確認問題:アラビア数字をローマ数字に変換しよう

アラビア数字をローマ数字に変換するプログラムを作成しましょう。

ユーザーが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

正解コードの解説

このコードはアラビア数字(例: 1234)をローマ数字(例: MCCXXXIV)に変換するプログラムです。

それではコードをブロックごとに解説していきます。

ローマ数字への変換メソッドの定義

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 = ""
  1. def convert_to_roman(number):
    • メソッドの定義です。convert_to_romanは入力されたアラビア数字をローマ数字に変換する機能を持ちます。
    • numberはメソッドの引数で、ユーザーが変換したい数字を指定します。
  2. roman_map:
    • ローマ数字の対応表(マッピング)をハッシュとして定義しています。
    • キーはアラビア数字(例: 1000)、値は対応するローマ数字(例: “M”)です。
  3. roman_numeral = "":
    • 結果となるローマ数字を格納するための変数を初期化します。最初は空の文字列です。

ローマ数字への変換ロジック

  roman_map.each do |key, value|
    while number >= key
      roman_numeral << value
      number -= key
    end
  end
  roman_numeral
end
  1. roman_map.each do |key, value|:
    • ハッシュroman_mapの各要素(キーと値のペア)を順に処理します。
    • 例えばキー1000と値"M"を取り出し、変換処理を行います。
  2. while number >= key:
    • アラビア数字numberが現在のキーkey以上の場合、この処理を繰り返します。
    • 例えばnumberが1500で、キーが1000の場合、この処理を1回実行します。
  3. roman_numeral << value:
    • 対応するローマ数字valueroman_numeralに追加します。
    • 例えばキーが1000の場合、"M"が追加されます。
  4. number -= key:
    • アラビア数字numberからキーkeyの値を引きます。
    • これにより、ローマ数字に変換済みの部分を取り除きます。

メイン処理部分

if __FILE__ == $0
  puts "アラビア数字を入力してください(1から3999の間):"
  number = gets.to_i
  roman_numeral = convert_to_roman(number)
  puts "ローマ数字: #{roman_numeral}"
end
  1. if __FILE__ == $0:
    • Rubyプログラムのエントリーポイントを指定します。このコードは、スクリプトとして実行された場合にのみ実行されます。
  2. puts "アラビア数字を入力してください(1から3999の間):":
    • ユーザーにアラビア数字の入力を求めるメッセージを表示します。
  3. number = gets.to_i:
    • ユーザーが入力した値を取得し、整数型(to_i)に変換して変数numberに格納します。
  4. roman_numeral = convert_to_roman(number):
    • 入力されたアラビア数字をローマ数字に変換するために、convert_to_romanメソッドを呼び出します。
  5. puts "ローマ数字: #{roman_numeral}":
    • 変換結果のローマ数字を表示します。

まとめ

このプログラムではRubyの基礎文法を学ぶことができます。特に以下の点が重要です。

  1. ハッシュを使用してデータを管理する方法。
  2. メソッドの定義引数の利用
  3. **繰り返し処理(eachやwhile)**の活用。

実際にコードを実行し、さまざまな数字を入力してローマ数字に変換してみましょう。

Rubyの基本的な書き方とロジック構築の理解が深まります。ぜひ他の変換ルールや改良案も試してみてください!

<<前のページ Ruby記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Rubyテキスト&問題集へ戻る
    トップページへ戻る