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

Java

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

Javaプログラミング向け練習問題、オブジェクト指向プログラミング編。今回のテーマは前回に引き続き(has-a 関連)のPart2です。
引数に参照型を用いたり、参照型の配列を用いたりなど、前回より応用的な利用が増えています。ぜひ、チャレンジしてみてください。

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

Javaプログラミング

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

解説動画

2023/03/9 解説動画を掲載しました。

問題編

Q001

問題

下の仕様に基づいて、各クラスを作成してください。
(仕様)
ゲームに登場するモンスターを表すMonsterクラスを作成します。
次のメンバ変数、コンストラクタを作成し、Monster.javaとして保存します。

  • メンバ変数を作成する
    • 名前を表すnameをString型で宣言する
    • 体力を表すhpをint型で宣言する
  • コンストラクタを作成する
    • 引数:
      • name:String型
      • hp:int型
    • 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。

ゲームに登場する勇者を表すYushaクラスを作成します。
次のメンバ変数、コンストラクタ、メソッドを作成し、Yusha.javaとして保存します。

  • メンバ変数を作成する
    • 名前を表すnameをString型で宣言する
    • 攻撃力を表すatkをint型で宣言する
  • コンストラクタを作成する
    • 引数:
      • name:String型
      • atk:int型
    • 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
  • attackメソッドを作成する
    • 引数:
      • target:Monster型(※攻撃対象を表す)
    • 戻り値:なし
    • 処理内容:
      • 攻撃対象のhpを減らす。減らす量は勇者の攻撃力の値とする
      • 「xxxxにyyyのダメージ!」と表示する。xxxxは攻撃対象モンスターの名前。yyyはHPを減らした量

提供コード

下のMain.javaをコメントの指示に基づいて追記します。
その後、作成した他のソースファイルと同じフォルダ内に保存して動作確認し、実行結果が得られることを確認してください。

(Main.java)

public class Main {
    public static void main(String[] args) {
        Yusha taro = new Yusha("タロウ", 10);
        Monster goblin = new Monster("ゴブリン", 20);

        //変数taroの持つメソッドattackを呼び出す。
        //引数はgoblinとする。

    }
}

実行結果

ゴブリンに10のダメージ!

(解答はこちら)

Q002

問題

下の仕様に基づいて、各クラスを作成してください。
(仕様)
会員が利用できるを表すCouponクラスを作成します。
次のメンバ変数、コンストラクタを作成し、Coupon.javaとして保存します。

  • メンバ変数を作成する
    • 名前を表すnameをString型で宣言する
    • 割引率を表すrateをdouble型で宣言する
  • コンストラクタを作成する
    • 引数:
      • name:String型
      • rate:double型
    • 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。

会員を表すMemberクラスを作成します。
次のメンバ変数、コンストラクタを作成し、Member.javaとして保存します。

  • メンバ変数を作成する
    • 名前を表すnameをString型で宣言する
    • 所持しているクーポンを表すcouponをCoupon型で宣言する
  • コンストラクタを作成する
    • 引数:
      • name:String型
    • 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
  • setCouponメソッドを作成する
    • 引数:
      • coupon:Coupon型
    • 戻り値:なし
    • 処理内容:引数couponを、メンバ変数couponに設定する
  • useCouponメソッドを作成する
    • 引数:
      • price:int型
    • 戻り値:int型
    • 処理内容:priceで与えられた金額に、所有しているクーポンの割引率をかけた値を求め、戻り値として返します。小数点以下の値は切り捨てます。

提供コード

下のMain.javaのコメント指示①②を追記し、保存します。
その後、作成した他のソースファイルと同じフォルダ内に保存して動作確認し、実行結果が得られることを確認してください。

public class Main {
    public static void main(String[] args) {
        Member taro = new Member("タロウ");
        Member hanako = new Member("ハナコ");

        Coupon silver = new Coupon("シルバー", 0.2);
        Coupon gold = new Coupon("ゴールド", 0.5);

        taro.setCoupon(silver);
        hanako.setCoupon(gold);

        //①taroの持つuseCouponメソッドを呼び出します。引数は2000とします。
        // 戻り値は、変数payを宣言して受け取ります。

        System.out.println("割引額は" + pay + "円です。");

        //②hanakoの持つuseCouponメソッドを呼び出します。引数は2000とします。
        // 戻り値は、変数payで受け取ります。

        System.out.println("割引額は" + pay + "円です。");
    }
}

実行結果

割引額は400円です。
割引額は1000円です。

(解答はこちら)

Q003

問題

下の仕様に基づいて、各クラスを作成してください。
(仕様)
SNSのメッセージに対する応答を表すReactionクラスを作成します。次のメンバ変数、コンストラクタを作成し、Reaction.javaとして保存します。

  • メンバ変数を作成する

    • 表情を表すfaceをString型で宣言する
    • リアクション回数を表すcountをint型で宣言する
  • コンストラクタを作成する

    • 引数:
      • face:String型
      • count:int型
    • 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
  • displayメソッドを作成する

    • 引数:なし
    • 戻り値:なし
    • 処理内容:「XXX:YYY」の形式で表示する。最後は改行しない。
      • XXXはメンバ変数faceの値
      • YYYはメンバ変数countの値

SNSのメッセージを表すMessageクラスを作成します。次のメンバ変数、コンストラクタを作成し、Message.javaとして保存します。

  • メンバ変数を作成する

    • メッセージ文を表すsentenceをString型で宣言する
    • Reactionインスタンスを持つ配列reactionsを宣言する。要素数は3とする。
    • 登録されているリアクションの数を表すcountをint型で宣言する。
  • コンストラクタを作成する

    • 引数:
      • sentence:String型
    • 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
  • setReactionメソッドを作成する

    • 引数:
      • reaction:Reaction型
    • 戻り値:なし
    • 処理内容:
      • reactions配列の空要素に、引数の値を設定する。
        ※空要素が無い場合の考慮は不要。
      • メンバ変数countの値を1加算する
  • displayメソッドを作成する

    • 引数:なし
    • 戻り値:なし
    • 処理内容:下記の処理を行う。改行の要否は実行結果から判断する。
      • メンバ変数sentenceの内容を表示。
      • 「----------」を表示。
      • reactionsに保持されている各Reactionインスタンスのdisplayメソッドを呼び出す。各displayメソッド呼び出し後は半角スペースを空ける。

提供コード

下のMain.javaのコメント指示①②を追記し、保存します。
その後、作成した他のソースファイルと同じフォルダ内に保存して動作確認し、実行結果が得られることを確認してください。

public class Main {
    public static void main(String[] args) {
        Message msg1 = new Message("今日はいい天気。散歩でも行こうかな");
        msg1.setReaction(new Reaction("(^ ^)",3));
        msg1.setReaction(new Reaction("(^o^)d",2));
        msg1.setReaction(new Reaction("(- -;)",0));

        Message msg2 = new Message("あれ~、買ったばかりの消しゴムがない");
        msg2.setReaction(new Reaction("(^ ^)",1));
        msg2.setReaction(new Reaction("(^o^)d",0));
        msg2.setReaction(new Reaction("(- -;)", 3));

        //①msg1のdisplayメソッドを呼び出す

        System.out.println();

        //②msg2のdisplayメソッドを呼び出す

    }
}

実行結果

今日はいい天気。散歩でも行こうかな
----------
(^ ^):3 (^o^)d:2 (- -;):0

あれ~、買ったばかりの消しゴムがない
----------
(^ ^):1 (^o^)d:0 (- -;):3

(解答はこちら)

解答編

それでは解答編です。

Q001

(Monster.java)

public class Monster {
    String name;
    int hp;

    Monster(String name, int hp) {
        this.name = name;
        this.hp = hp;
    }   
}

(Yusha.java)

public class Yusha {
    String name;
    int atk;

    Yusha(String name, int atk) {
        this.name = name;
        this.atk = atk;
    }

    void attack( Monster target ) {
        target.hp -= this.atk;
        System.out.println( target.name + "に" + this.atk + "のダメージ!");
    }
}

(Main.java)

public class Main {
    public static void main(String[] args) {
        Yusha taro = new Yusha("タロウ", 10);
        Monster goblin = new Monster("ゴブリン", 20);
        
        //変数taroの持つメソッドattackを呼び出す。
        //引数はgoblinとします。
        taro.attack(goblin);
    }
}

(問題に戻る)

Q002

(Coupon.java)

public class Coupon {
    String name;
    double rate;

    Coupon( String name, double rate) {
        this.name = name;
        this.rate = rate;
    }
}

(Member.java)

public class Member {
    String name;
    Coupon coupon;

    Member(String name) {
        this.name = name;
    }

    void setCoupon(Coupon coupon) {
        this.coupon = coupon;
    }
    
    int useCoupon( int price ) {
        return (int)(price * coupon.rate);
    }

}

(Main.java)

public class Main {
    public static void main(String[] args) {
        Member taro = new Member("タロウ");
        Member hanako = new Member("ハナコ");

        Coupon silver = new Coupon("シルバー", 0.2);
        Coupon gold = new Coupon("ゴールド", 0.5);
        
        taro.setCoupon(silver);
        hanako.setCoupon(gold);

        //taroの持つuseCouponメソッドを呼び出します。引数は2000とします。
        //戻り値は、変数payを宣言して受け取ります。
        int pay = taro.useCoupon(2000);
        System.out.println("割引額は" + pay + "円です。");

        //hanakoの持つuseCouponメソッドを呼び出します。引数は2000とします。
        //戻り値は、変数payを宣言して受け取ります。
        pay = hanako.useCoupon(2000);
        System.out.println("割引額は" + pay + "円です。");
    }
}

(問題に戻る)

Q003

(Reaction.java)

public class Reaction {
    String face;
    int count;

    Reaction(String face,int count) {
        this.face = face;
        this.count = count;
    }
    
    void display() {
        System.out.print(face);
        System.out.print(":" + count);
    }
}

(Message.java)

public class Message {
    String sentence;
    Reaction[] reactions = new Reaction[3];
    int count;

    Message(String sentence) {
        this.sentence = sentence;
    }

    void setReaction(Reaction action) {
        this.reactions[count++] = action;
    }
    
    void display() {
        System.out.println(sentence);
        System.out.println("----------");
        for (int i = 0; i < count; i++) {
            reactions[i].display();
            System.out.print(" ");
        }
        System.out.println();
    }
}

(Main.java)

public class Main {
    public static void main(String[] args) {
        Message msg1 = new Message("今日はいい天気。散歩でも行こうかな");
        msg1.setReaction(new Reaction("(^ ^)",3));
        msg1.setReaction(new Reaction("(^o^)d",2));
        msg1.setReaction(new Reaction("(- -;)",0));

        Message msg2 = new Message("あれ~、買ったばかりの消しゴムがない");
        msg2.setReaction(new Reaction("(^ ^)",1));
        msg2.setReaction(new Reaction("(^o^)d",0));
        msg2.setReaction(new Reaction("(- -;)", 3));

        //①msg1のdisplayメソッドを呼び出す
        msg1.display();
        System.out.println();
        //②msg2のdisplayメソッドを呼び出す
        msg2.display();
    }
}

(問題に戻る)

おわりに

本日は以上となります。最後までご覧くださりありがとうございます。クラスを作成し、それを参照型として使えるようになると、Javaのプログラミングの幅がグッと広がります。皆様の日々の学習の一助になれば幸いです。


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

ECFエデュケーション
タイトルとURLをコピーしました