こんにちは。ECF Tech
ブログ担当 Michiharu.Tです。
Javaプログラミング向け練習問題、オブジェクト指向プログラミング編。今回のテーマは前回に引き続き(has-a 関連)のPart2です。
引数に参照型を用いたり、参照型の配列を用いたりなど、前回より応用的な利用が増えています。ぜひ、チャレンジしてみてください。
一般的な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加算する
- reactions配列の空要素に、引数の値を設定する。
- 引数:
-
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のプログラミングの幅がグッと広がります。皆様の日々の学習の一助になれば幸いです。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。