こんにちは。ECF Tech
ブログ担当 Michiharu.Tです。
Javaプログラミング向け練習問題、オブジェクト指向プログラミング編。今回のテーマは(has-a 関連)です。
オブジェクト指向プログラミングでは、参照型変数を駆使してプログラミングができることがとても重要になります。今回はベーシックな2問と典型的なアルゴリズムであるリスト構造の問題を作ってみました。
一般的なJavaの学習順序に沿ったテーマの一覧(※随時追加)は、こちらのリンクよりご確認頂けます。
Javaのトピックスです。主に初心者向けにプログラミング学習ネタを提供していきます。
解説動画
2023/03/2 解説動画を掲載しました。
問題編
Q001
問題
下の仕様に基づいて、各クラスを作成してください。
提供コードのMain.javaを、作成したソースファイルと同じフォルダ内に保存して動作確認し、
実行結果が得られることを確認してください。
(仕様)
Menuクラスはハンバーガーショップの商品を扱うクラスです。
次のメンバ変数、コンストラクタ、メソッドを作成し、Menu.javaとして保存します。
- メンバ変数を作成する
- 商品名を表すnameをString型で宣言する
- 価格を表すpriceをint型で宣言する
- コンストラクタを作成する
- 引数:
- name:String型
- price:int型
- 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
- 引数:
- displayメソッドを作成する
- 引数:なし
- 戻り値:なし
- 処理内容:次の書式で画面に表示する。
「XXXXXX:YYY円」
※XXXXXX は、メンバ変数nameを表示
※YYYは、メンバ変数priceを表示
SetMenuクラスはハンバーガーショップのセット商品を扱うクラスです。
次のメンバ変数、コンストラクタ、メソッドを作成し、SetMenu.javaとして保存します。
- メンバ変数を作成する
- セット商品名を表すnameをString型で宣言する
- ハンバーガーを表すsandwitchをMenu型で宣言する
- ドリンクを表すdrinkをMenu型で宣言する
- コンストラクタを作成する
- 引数:
- name:String型
- sandwitch:Menu型
- drink:Menu型
- 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
- 引数:
- displayメソッドを作成する
- 引数:なし
- 戻り値:なし
- 処理内容:
- セット商品名を表示する
- 「---」を表示する
- ハンバーガーを表すMenuインスタンスのdisplayメソッドを呼び出す
- ドリンクを表すMenuインスタンスのdisplayメソッドを呼び出す
- 「---」を表示する
- 価格を実行結果のように表示する。但し、各商品合計額の20%引きとする
提供コード
(Main.java)
public class Main { public static void main(String[] args) { //ハンバーガーを生成 Menu sandwitch = new Menu("ハンバーガー", 150); //オレンジジュースを生成 Menu drink = new Menu("オレンジジュース", 100); //セットメニューを生成 SetMenu burgerset = new SetMenu("ハンバーガーセット", sandwitch, drink); //セットメニューを表示 burgerset.display(); } }
実行結果
ハンバーガーセット --- ハンバーガー:150円 オレンジジュース:100円 --- セット価格:200円
(解答はこちら)
Q002
問題
下の仕様に基づいて、各クラスを作成してください。
提供コードのMain.javaを、作成したソースファイルと同じフォルダ内に保存して動作確認し、
実行結果が得られることを確認してください。
(仕様)
Bukiクラスはゲーム内の武器を扱うクラスです。
次のメンバ変数、コンストラクタ、メソッドを作成し、Buki.javaとして保存します。
- メンバ変数を作成する
- 名前を表すnameをString型で宣言する
- 攻撃力を表すatkをint型で宣言する
- コンストラクタを作成する
- 引数:
- name:String型
- atk:int型
- 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
- 引数:
Yushaクラスはゲーム内の主人公「勇者」を扱うクラスです。
次のメンバ変数、コンストラクタ、メソッドを作成し、Yusha.javaとして保存します。
- メンバ変数を作成する
- 名前を表すnameをString型で宣言する
- HPを表すhpをint型で宣言する
- 攻撃力を表すatkをint型で宣言する
- 装備している武器を表すbukiをBuki型で宣言する
- コンストラクタを作成する
- 引数:
- name:String型
- hp:int型
- atk:int型
- 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
- 引数:
- displayStatusメソッドを作成する
- 引数:なし
- 戻り値:なし
- 処理内容:
- 「勇者:XXXX」と表示する。※XXXXはメンバ変数name
- 「HP:YYY」と表示する。※YYYはメンバ変数hp
- 攻撃力を表示する。
- 武器を装備していない(null)場合
「攻撃力:ZZZ」と表示する。※ZZZはメンバ変数atk - 武器を装備している場合
「攻撃力:ZZZ +A」と表示する。※zzzはメンバ変数atk、Aはメンバ変数bukiが持つatk
- 武器を装備していない(null)場合
提供コード
(Main.java)
public class Main { public static void main(String[] args) { Yusha taro = new Yusha("タロウ", 20, 10); taro.displayStatus(); System.out.println("---"); taro.buki = new Buki("鉄の剣", 10); taro.displayStatus(); } }
実行結果
勇者:タロウ HP:20 攻撃力:10 --- 勇者:タロウ HP:20 攻撃力:10 +10
(解答はこちら)
Q003
問題
下の仕様に基づいて、各クラスを作成してください。
提供コードのMain.javaを作成したソースファイルと同じフォルダ内に保存して動作確認し、
実行結果が得られることを確認してください。
(仕様)
Nodeクラスはリスト構造を実現する単一データを扱うクラスです。
次のメンバ変数、コンストラクタ、メソッドを作成し、Node.javaとして保存します。
- メンバ変数を作成する
- 値を表すvalueをint型で宣言する
- 次のNodeインスタンスの参照を持つnextをNode型で宣言する
- コンストラクタを作成する
- 引数:
- value:int型
- 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
- 引数:
- displayメソッドを作成する
- 引数:なし
- 戻り値:なし
- 処理内容:
- メンバ変数valueの値を表示する。
提供コード
(Main.java)
public class Main { public static void main(String[] args) { Node n1 = new Node(5); Node n2 = new Node(8); Node n3 = new Node(12); Node n4 = new Node(7); n1.next = n2; n2.next = n3; n3.next = n4; //各ノードの値を表示する Node now = n1; while( now != null ){ now.display(); now = now.next; } } }
実行結果
5 8 12 7
(解答はこちら)
解答編
それでは解答編です。
Q001
(Menu.java)
public class Menu { String name; //名前 int price; //価格 /** * コンストラクタ */ public Menu(String name, int price) { this.name = name; this.price = price; } /** * displayメソッド */ public void display() { System.out.println( name + ":" + price + "円" ); } }
(SetMenu.java)
public class SetMenu { String name; //名前 Menu sandwitch; //ハンバーガー Menu drink; //ドリンク /** * コンストラクタ */ public SetMenu(String name, Menu sandwitch, Menu drink) { this.name = name; this.sandwitch = sandwitch; this.drink = drink; } /** * displayメソッド */ public void display() { System.out.println(this.name); System.out.println("---"); sandwitch.display(); drink.display(); System.out.println("---"); int price = (int)((sandwitch.price + drink.price)*0.8); System.out.println("セット価格:" + price + "円" ); } }
(問題に戻る)
Q002
(Buki.java)
public class Buki { String name; //名前 int atk; //攻撃力 /** * コンストラクタ */ public Buki( String name, int atk ) { this.name = name; this.atk = atk; } }
(Yusha.java)
public class Yusha { String name; //名前 int hp; //HP int atk; //攻撃力 Buki buki; //武器 /** * コンストラクタ */ public Yusha(String name, int hp, int atk) { this.name = name; this.hp = hp; this.atk = atk; } /** * displayStatusメソッド */ public void displayStatus() { System.out.println("勇者:" + name); System.out.println("HP:" + hp); if (buki == null) { //武器を持たない場合 System.out.println("攻撃力:" + atk); } else { //武器を持つ場合 System.out.println("攻撃力:" + atk + " +" + buki.atk ); } } }
(問題に戻る)
Q003
public class Node { int value; //このノードの値 Node next; //次のノードへの参照 /** * コンストラクタ */ public Node(int value) { this.value = value; } /** * ディスプレイメソッド */ public void display() { System.out.println( this.value ); } }
この問題はプログラミングにおける代表的なデータ構造の1つ、単方向リストを表しています。下の図のようなイメージになります。
ここでは詳しく触れませんが、興味のある方は「リスト プログラミング」「単方向リスト」などで調べてみてください。
(問題に戻る)
おわりに
本日は以上となります。最後までご覧くださりありがとうございます。has-a 関連を理解すると、オブジェクトの考え方が徐々にクリアになっていきます。引き続き問題をご提供していけたらと思います。よろしくお願いします。
[PR]
Javaをもっと詳しく学びたい!という方には、下の書籍がおススメです!筆者も愛用しています。