オブジェクト指向練習問題。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;
}
}

コメント