こんにちは。ECF Tech
ブログ担当 Michiharu.Tです。
Javaプログラミング向け練習問題、オブジェクト指向プログラミング編。今回のテーマは前回に引き続き(has-a 関連)のPart2です。
引数に参照型を用いたり、参照型の配列を用いたりなど、前回より応用的な利用が増えています。ぜひ、チャレンジしてみてください。
一般的なJavaの学習順序に沿ったテーマの一覧(※随時追加)は、こちらのリンクよりご確認頂けます。

Javaのトピックスです。主に初心者向けにプログラミング学習ネタを提供していきます。
問題編
Q001
問題
下の仕様に基づいて、各クラスを作成してください。
(仕様)
ゲームに登場するモンスターを表すMonsterクラスを作成します。
次のフィールド、コンストラクタを作成し、Monster.javaとして保存します。
- フィールドを作成する
- 名前を表すnameをString型で宣言する
- 体力を表すhpをint型で宣言する
- コンストラクタを作成する
- 引数:
- name:String型
- hp:int型
- 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
- 引数:
ゲームに登場する勇者を表すYushaクラスを作成します。
次のフィールド、コンストラクタ、メソッドを作成し、Yusha.javaとして保存します。
- フィールドを作成する
- 名前を表すnameをString型で宣言する
- 攻撃力を表すatkをint型で宣言する
- コンストラクタを作成する
- 引数:
- name:String型
- atk:int型
- 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
- 引数:
- attackメソッドを作成する
- 引数:
- 攻撃対象を表すMonster型の引数 target
- 処理内容:
- 攻撃対象の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型
- 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
- 引数:
- couponGetメソッドを作成する
- 引数:
- 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.couponGet(silver); hanako.couponGet(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メソッドを作成する
- 引数:なし
- 戻り値:なし
- 処理内容:
- フィールドfaceを表示。
- 「:」を表示。
- フィールドcountを表示。
- 上記3つはすべて改行せずに表示する。
SNSのメッセージを表すMessageクラスを作成します。
次のフィールド、コンストラクタを作成し、Message.javaとして保存します。
- フィールドを作成する
- メッセージ文を表すsentenceをString型で宣言する
- Reactionインスタンスを持つ配列actionsを宣言する。要素数は3とする。
- 登録されているリアクションの数を表すcountをint型で宣言する。
- コンストラクタを作成する
- 引数:
- sentence:String型
- 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
- 引数:
- displayメソッドを作成する
- 引数:なし
- 戻り値:なし
- 処理内容:
- フィールドsentenceの内容を表示
- 「----------」を表示。
- actionsに保持されている各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; public Monster(String name, int hp) { this.name = name; this.hp = hp; } }
(Yusha.java)
public class Yusha { String name; int atk; public Yusha(String name, int atk) { this.name = name; this.atk = atk; } public 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; public Coupon( String name, double rate) { this.name = name; this.rate = rate; } }
(Member.java)
public class Member { String name; Coupon coupon; public Member(String name) { this.name = name; } public void couponGet(Coupon coupon) { this.coupon = coupon; } public 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.couponGet(silver); hanako.couponGet(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; public Reaction(String face,int count) { this.face = face; this.count = count; } public void display() { System.out.print(face); System.out.print(":" + count); } }
(Message.java)
public class Message { String sentence; Reaction[] actions = new Reaction[3]; int count; public Message(String sentence) { this.sentence = sentence; } public void setReaction(Reaction action) { this.actions[count++] = action; } public void display() { System.out.println(sentence); System.out.println("----------"); for (int i = 0; i < count; i++) { actions[i].display(); System.out.print(" "); } System.out.println(); } }
Q003
(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のプログラミングの幅がグッと広がります。皆様の日々の学習の一助になれば幸いです。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。
