Javaプログラミング練習問題(has-a 関連 Part1)

Java

こんにちは。ECF Tech
ブログ担当 Michiharu.Tです。

Javaプログラミング向け練習問題、オブジェクト指向プログラミング編。今回のテーマは(has-a 関連)です。
オブジェクト指向プログラミングでは、参照型変数を駆使してプログラミングができることがとても重要になります。今回はベーシックな2問と典型的なアルゴリズムであるリスト構造の問題を作ってみました。

一般的なJavaの学習順序に沿ったテーマの一覧(※随時追加)は、こちらのリンクよりご確認頂けます。

Javaプログラミング

Javaのトピックスです。主に初心者向けにプログラミング学習ネタを提供していきます。

問題編

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型で宣言する
    • ハンバーガーを表すsandwichをMenu型で宣言する
    • ドリンクを表すdrinkをMenu型で宣言する
  • コンストラクタを作成する
    • 引数:
      • name:String型
      • sandwich: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型
    • 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。

Yusyaクラスはゲーム内の主人公「勇者」を扱うクラスです。
次のフィールド、コンストラクタ、メソッドを作成し、Yusha.javaとして保存します。

  • フィールドを作成する
    • 名前を表すnameをString型で宣言する
    • 攻撃力を表すatkをint型で宣言する
  • コンストラクタを作成する
    • 引数:
      • name:String型
      • atk:int型
    • 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
  • displayStatusメソッドを作成する
    • 引数:なし
    • 処理内容:
      • 「勇者:XXXX」と表示する。※XXXXはフィールドname
      • 「HP:YYY」と表示する。※YYYはフィールドhp
      • 攻撃力を表示する。
        • 武器を装備していない(null)場合
           「攻撃力:ZZZ」と表示する。※ZZZはフィールドatk
        • 武器を装備している場合
           「攻撃力:ZZZ +A」と表示する。※zzzはフィールドatk、Aはフィールドbukiが持つatk

提供コード

(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 sandwich;      //ハンバーガー
    Menu drink; //ドリンク

    /**
     * コンストラクタ
     */
    public SetMenu(String name, Menu sandwich, Menu drink) {
        this.name = name;
        this.sandwich = sandwich;
        this.drink = drink;
    }
    
    /**
     * displayメソッド
     */
    public void display() {
        System.out.println(this.name);
        System.out.println("---");
        sandwich.display();
        drink.display();
        System.out.println("---");

        int price = (int)((sandwich.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 関連を理解すると、オブジェクトの考え方が徐々にクリアになっていきます。引き続き問題をご提供していけたらと思います。よろしくお願いします。


合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。

ECFエデュケーション
キッズも大人も。沖縄からITのマナビを応援します
タイトルとURLをコピーしました