オブジェクト指向練習問題。has-a,例外処理。
Q1
傘クラスと傘立てクラス、アプリケーションクラスをつくり。
各操作ができるプログラムを作成せよ。
■クラス:Umbrella
<フィールド変数>
private String color;
private int size;
<一般メソッド>
public toString()
■クラス:UmbrellaStand
<フィールド変数>
private Umbrella umbrella;
<一般メソッド>
public void putUmbrella(Umbrella u)
…引数でもらった傘を傘立てにたてる
public Umbrella takeUmbrella()
…傘を取り出してその傘を返す
public boolean hasUmbrella()
…現在傘がセットされているかをboolで返す
public Umbrella getUmbrella()
…getter
public String toString()
■アプリケーションクラス:UmbrellaApp
傘と傘立てをそれぞれ5個ずつインスタンス化して処理を行う。
ユーザーからの入力を受け取る際には例外処理を入れて、不正な値の場合は再入力させること。
詳しくは実行例を参照のこと。
[実行例]
5個の傘立てに傘を収納してください。 ***傘立て*** 0---空 1---空 2---空 3---空 4---空 傘立ての番号を選んでください>5 err:[0~4の整数を入力してください] 傘立ての番号を選んでください>三 err:[0~4の整数を入力してください] 傘立ての番号を選んでください>3 どの傘を入れますか? 0---色:赤, 長さ:60 1---色:橙, 長さ:65 2---色:黄, 長さ:60 3---色:緑, 長さ:70 4---色:青, 長さ:60 傘の番号を選んでください>4 色:青, 長さ:60 の傘が立てられました。 ***傘立て*** 0---空 1---空 2---空 3---色:青, 長さ:60 4---空 傘立ての番号を選んでください>0 どの傘を入れますか? 0---色:赤, 長さ:60 1---色:橙, 長さ:65 2---色:黄, 長さ:60 3---色:緑, 長さ:70 傘の番号を選んでください>3 色:緑, 長さ:70 の傘が立てられました。 ***傘立て*** 0---色:緑, 長さ:70 1---空 2---空 3---色:青, 長さ:60 4---空 傘立ての番号を選んでください>1 どの傘を入れますか? 0---色:赤, 長さ:60 1---色:橙, 長さ:65 2---色:黄, 長さ:60 傘の番号を選んでください>0 色:赤, 長さ:60 の傘が立てられました。 ***傘立て*** 0---色:緑, 長さ:70 1---色:赤, 長さ:60 2---空 3---色:青, 長さ:60 4---空 傘立ての番号を選んでください>1 色:赤, 長さ:60 の傘が入っています。 取り出しますか?1.Yes 2.No>1 色:赤, 長さ:60 の傘が取り出されました。 ***傘立て*** 0---色:緑, 長さ:70 1---空 2---空 3---色:青, 長さ:60 4---空 傘立ての番号を選んでください>2 どの傘を入れますか? 0---色:橙, 長さ:65 1---色:黄, 長さ:60 2---色:赤, 長さ:60 傘の番号を選んでください>2 色:赤, 長さ:60 の傘が立てられました。 ***傘立て*** 0---色:緑, 長さ:70 1---空 2---色:赤, 長さ:60 3---色:青, 長さ:60 4---空 傘立ての番号を選んでください>1 どの傘を入れますか? 0---色:橙, 長さ:65 1---色:黄, 長さ:60 傘の番号を選んでください>1 色:黄, 長さ:60 の傘が立てられました。 ***傘立て*** 0---色:緑, 長さ:70 1---色:黄, 長さ:60 2---色:赤, 長さ:60 3---色:青, 長さ:60 4---空 傘立ての番号を選んでください>3 色:青, 長さ:60 の傘が入っています。 取り出しますか?1.Yes 2.No>2 ***傘立て*** 0---色:緑, 長さ:70 1---色:黄, 長さ:60 2---色:赤, 長さ:60 3---色:青, 長さ:60 4---空 傘立ての番号を選んでください>4 どの傘を入れますか? 0---色:橙, 長さ:65 傘の番号を選んでください>0 色:橙, 長さ:65 の傘が立てられました。 ***傘立て*** 0---色:緑, 長さ:70 1---色:黄, 長さ:60 2---色:赤, 長さ:60 3---色:青, 長さ:60 4---色:橙, 長さ:65 収納が終わりました。アプリケーションを終了します。
一般クラス
public class Umbrella { private String color; private int size; public Umbrella(String color, int size) { this.color = color; this.size = size; } @Override public String toString() { return String.format("色:%s, 長さ:%d", this.color, this.size); } } class UmbrellaStand { private Umbrella umbrella; public void putUmbrella(Umbrella u) { this.umbrella = u; System.out.println(u); System.out.println("の傘が立てられました。"); } public Umbrella takeUmbrella() { Umbrella retUmbrella = this.umbrella; System.out.println(this.umbrella); System.out.println("の傘が取り出されました。"); this.umbrella = null; return retUmbrella; } public boolean hasUmbrella() { return this.umbrella != null; } public Umbrella getUmbrella() { return this.umbrella; } @Override public String toString() { return hasUmbrella() ? this.umbrella.toString() : "空"; } }
アプリケーションクラス
import java.util.*; public class UmbrellaApp { private static List<Umbrella> u_list = new ArrayList<>(); private static List<UmbrellaStand> s_list = new ArrayList<>(); private static Scanner s = new Scanner(System.in); public static void main(String[] args) { init(); System.out.println(s_list.size() + "個の傘立てに傘を収納してください。"); while (true) { displayUmbrellaStand(); int index = getInputRange("傘立ての番号を選んでください>", 0, s_list.size() - 1); UmbrellaStand us = s_list.get(index); if (us.hasUmbrella()) { System.out.println(us.getUmbrella()); System.out.println("の傘が入っています。"); int select = getInputRange("取り出しますか?1.Yes 2.No>", 1, 2); if (select == 1) { u_list.add(us.takeUmbrella()); } } else { System.out.println("どの傘を入れますか?"); displayUmbrella(); int u_index = getInputRange("傘の番号を選んでください>", 0, u_list.size() - 1); us.putUmbrella(u_list.get(u_index)); u_list.remove(u_index); if (u_list.size() == 0) { displayUmbrellaStand(); System.out.println("収納が終わりました。アプリケーションを終了します。"); return; } } } } public static void init() { // 傘作成 u_list.add(new Umbrella("赤", 60)); u_list.add(new Umbrella("橙", 65)); u_list.add(new Umbrella("黄", 60)); u_list.add(new Umbrella("緑", 70)); u_list.add(new Umbrella("青", 60)); // 傘立て作成 for (int i = 0; i < 5; i++) { s_list.add(new UmbrellaStand()); } } public static void displayUmbrellaStand() { System.out.println("***傘立て***"); for (int i = 0; i < s_list.size(); i++) { System.out.println(i + "---" + s_list.get(i)); } } public static void displayUmbrella() { for (int i = 0; i < u_list.size(); i++) { System.out.println(i + "---" + u_list.get(i)); } } static int getInputRange(String msg, int min, int max) { int n; while (true) { // scannerは例外を発生した際値を保持し続けるのでループの頭でnewする。 s = new Scanner(System.in); System.out.print(msg); try { n = s.nextInt();// nextIntは整数以外だとInputMismatchExceptionを投げる if (n < min || n > max) { // この場合も例外を投げる throw new InputMismatchException(); } // 適正な値が入ったらループを抜ける break; } catch (InputMismatchException e) { System.out.printf("err:[%d~%dの整数を入力してください]\n", min, max); } } return n; } }
コメント