JAVAの初心者向け問題4-☆4:アラビア数字をローマ数字に変換するプログラムを実装しよう
この問題を解くために必要な知識:
【レベル1~3の知識】
コメントの書き方、変数と定数、基本データ型とプリミティブ型、四則演算と論理演算、入力と出力(Scannerクラス)、配列、分岐処理(if、if~else、switch)、繰り返し処理(for、while、do~while)、メソッドの定義と呼び出し、メソッドの戻り値、メソッドのオーバーロード、例外処理(try-catch文、throws、throw)、レベル1と2の知識、コレクションの基礎、コレクション(List, ArrayList)、コレクション(HashSet, TreeSet)、コレクション(HashMap, TreeMap)、
【レベル4の知識】
クラスの定義と使用、インスタンス、コンストラクタ、ゲッターとセッター、カプセル化、クラスメンバ、インスタンスメソッド、クラスの継承、抽象クラス、インターフェース
<<前の問題 | 問題集Top |
次の問題>> |
JAVA練習問題4-☆4:アラビア数字をローマ数字に変換するプログラムを実装しよう
アラビア数字(1、2、3、…)をローマ数字(I、II、III、…)に変換するプログラムを作成しましょう。
このプログラムでは、ユーザーが入力したアラビア数字を対応するローマ数字に変換して出力します。
この問題の要件
以下の要件を満たすプログラムを作成してください。
ArabicToRomanConverter
クラスを作成し、アラビア数字をローマ数字に変換するconvert
メソッドを実装すること。- ユーザーからアラビア数字(1から3999の間)を入力として受け取ること。
- アラビア数字をローマ数字に変換するメソッド
convertToRoman(int number)
を作成すること。 - ローマ数字は以下のように対応します:
- 1 -> I
- 4 -> IV
- 5 -> V
- 9 -> IX
- 10 -> X
- 40 -> XL
- 50 -> L
- 90 -> XC
- 100 -> C
- 400 -> CD
- 500 -> D
- 900 -> CM
- 1000 -> M
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
アラビア数字を入力してください(1から3999の間): 1987 ローマ数字: MCMLXXXVII
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.import文
1-1. Scannerクラスのインポート
1-2. HashMapクラスのインポート
1-3. Mapクラスのインポート
2.ArabicToRomanクラスの定義
2-1. mainメソッド
2-1-1. Scannerオブジェクトの作成
2-1-1-1. Scannerオブジェクトを使ってユーザーからの入力を受け取る準備
2-1-2. ユーザーにアラビア数字を入力させる
2-1-2-1. 入力を促すメッセージを表示
2-1-2-2. ユーザーの入力を取得し、number変数に格納
2-1-3. 入力された数字をローマ数字に変換する
2-1-3-1. convertToRomanメソッドを呼び出し、変換結果をromanNumeral変数に格納
2-1-4. 結果を出力する
2-1-4-1. 変換されたローマ数字を表示
2-1-5. Scannerオブジェクトを閉じる
2-1-5-1. リソースを解放するためにScannerオブジェクトを閉じる
3.convertToRomanメソッドの定義
3-1. 引数としてアラビア数字のint型numberを受け取る
3-2. ローマ数字の対応をMapに定義
3-2-1. HashMapオブジェクトを作成し、ローマ数字の対応を追加
3-3. StringBuilderオブジェクトの作成
3-3-1. 変換結果を効率的に構築するためのStringBuilderを用意
3-4. ローマ数字の対応を繰り返し処理でチェックしながら変換する
3-4-1. romanMapのキーを順に取り出し、対応するローマ数字に変換
3-4-2. 変換が完了するまで繰り返し処理を行う
3-4-2-1. numberが現在のキー以上の場合、対応するローマ数字を追加し、numberを減算
3-5. 変換結果を返す
3-5-1. StringBuilderオブジェクトの内容を文字列として返す
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
import java.util.Scanner; import java.util.HashMap; import java.util.Map; public class ArabicToRoman { // メインメソッド public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // ユーザーにアラビア数字を入力させる System.out.print("アラビア数字を入力してください(1から3999の間): "); int number = scanner.nextInt(); // 入力された数字をローマ数字に変換する // ***このコメントを消して、convertToRomanメソッドを呼び出し、変数に結果を格納するコードを書いてください*** String romanNumeral = convertToRoman(number); // 結果を出力する System.out.println("ローマ数字: " + romanNumeral); scanner.close(); } // アラビア数字をローマ数字に変換するメソッド public static String convertToRoman(int number) { // ローマ数字の対応をマップに定義 Map<Integer, String> romanMap = new HashMap<>(); // ***このコメントを消して、romanMapにローマ数字の対応を追加するコードを書いてください*** romanMap.put(1000, "M"); romanMap.put(900, "CM"); romanMap.put(500, "D"); romanMap.put(400, "CD"); romanMap.put(100, "C"); romanMap.put(90, "XC"); romanMap.put(50, "L"); romanMap.put(40, "XL"); romanMap.put(10, "X"); romanMap.put(9, "IX"); romanMap.put(5, "V"); romanMap.put(4, "IV"); romanMap.put(1, "I"); StringBuilder romanNumeral = new StringBuilder(); // ローマ数字の対応を繰り返し処理でチェックしながら変換する // ***このコメントを消して、forループを使ってローマ数字に変換するコードを書いてください*** for (int key : romanMap.keySet()) { while (number >= key) { romanNumeral.append(romanMap.get(key)); number -= key; } } return romanNumeral.toString(); } }
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
********************
import java.util.Scanner; import java.util.HashMap; import java.util.Map; public class ArabicToRoman { // メインメソッド public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // ユーザーにアラビア数字を入力させる System.out.print("アラビア数字を入力してください(1から3999の間): "); int number = scanner.nextInt(); // 入力された数字をローマ数字に変換する String romanNumeral = convertToRoman(number); // 結果を出力する System.out.println("ローマ数字: " + romanNumeral); scanner.close(); } // アラビア数字をローマ数字に変換するメソッド public static String convertToRoman(int number) { // ローマ数字の対応をマップに定義 Map<Integer, String> romanMap = new HashMap<>(); romanMap.put(1000, "M"); romanMap.put(900, "CM"); romanMap.put(500, "D"); romanMap.put(400, "CD"); romanMap.put(100, "C"); romanMap.put(90, "XC"); romanMap.put(50, "L"); romanMap.put(40, "XL"); romanMap.put(10, "X"); romanMap.put(9, "IX"); romanMap.put(5, "V"); romanMap.put(4, "IV"); romanMap.put(1, "I"); StringBuilder romanNumeral = new StringBuilder(); // ローマ数字の対応を繰り返し処理でチェックしながら変換する for (int key : romanMap.keySet()) { while (number >= key) { romanNumeral.append(romanMap.get(key)); number -= key; } } return romanNumeral.toString(); } }
********************
コードの解説
インポート文とメインメソッドの設定
import java.util.Scanner; import java.util.HashMap; import java.util.Map; public class ArabicToRoman { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);
import java.util.Scanner;
は、ユーザー入力を受け取るためのScanner
クラスをインポートしています。これにより、コンソールからアラビア数字を入力することが可能になります。import java.util.HashMap;
とimport java.util.Map;
は、ローマ数字への変換のために使用されるMap
の実装であるHashMap
を使えるようにします。public class ArabicToRoman
は、プログラム全体を格納するクラス定義です。クラスは、Javaのプログラムを構成する基本的な単位です。
ユーザー入力とローマ数字変換の呼び出し
System.out.print("アラビア数字を入力してください(1から3999の間): "); int number = scanner.nextInt(); String romanNumeral = convertToRoman(number);
System.out.print
は、ユーザーにメッセージを表示し、アラビア数字の入力を促します。scanner.nextInt()
は、ユーザーから入力された数字を受け取り、number
という変数に格納します。convertToRoman(number)
は、次に定義される変換メソッドを呼び出し、アラビア数字をローマ数字に変換します。
アラビア数字をローマ数字に変換するメソッド
public static String convertToRoman(int number) { Map<Integer, String> romanMap = new HashMap<>(); romanMap.put(1000, "M"); romanMap.put(900, "CM"); // その他の値も同様に追加
convertToRoman
は、アラビア数字をローマ数字に変換するためのメソッドです。Map<Integer, String>
は、キーとしてアラビア数字(例:1000)を、値としてそれに対応するローマ数字(例:”M”)を格納するデータ構造です。romanMap.put(1000, "M");
では、1000が入力された場合に”M”(ローマ数字の1000)を返すように設定しています。このように、すべての対応するアラビア数字とローマ数字のペアが定義されています。
ローマ数字への変換処理
StringBuilder romanNumeral = new StringBuilder(); for (int key : romanMap.keySet()) { while (number >= key) { romanNumeral.append(romanMap.get(key)); number -= key; } }
StringBuilder romanNumeral
は、効率的に文字列を構築するためのクラスです。ローマ数字が追加されていくたびに、このオブジェクトに文字列が追加されます。for (int key : romanMap.keySet())
は、マップのすべてのキー(1000, 900, 500など)を順番に処理し、入力されたアラビア数字がそれらのキーより大きいかどうかをチェックします。while (number >= key)
は、入力された数字がそのキー以上である間、そのキーに対応するローマ数字をromanNumeral
に追加し、入力された数字からそのキーの値を引きます。これにより、アラビア数字が完全にローマ数字に変換されます。
結果の表示
System.out.println("ローマ数字: " + romanNumeral); scanner.close();
System.out.println
は、変換されたローマ数字を出力します。scanner.close()
は、Scanner
クラスを閉じ、リソースを解放します。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。