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