オブジェクト指向基本問題。

Q1
財布を表すクラスWallet、自動販売機を表すクラスVendingMachineを作成し、各操作ができるプログラムを作成する。
■一般クラス:Wallet
<フィールド変数(field)>
private int money 現在の財布の中身

<コンストラクタ(constructor)>
public Wallet(int money)
… 財布の中身の初期値を指定してインスタンスを生成
  ただし引数moneyの値がマイナスの場合は0円とする

<メソッド(method)>
insertMoney
… 引数に指定された金額を財布に入れる
takeOutMoney
… 引数に指定された金額を財布から取り出す
  ただし金額が不足する場合は財布内の全額を取り出す
display
… 現在の財布の中身を表示する

■一般クラス:VendingMachine
<フィールド変数(field)>
private int money 投入された金額
private int num 商品の個数

<コンストラクタ(constructor)>
public VendingMachine(int n)
… 商品の個数を指定してインスタンスを生成
  投入金額の初期値は0円とする

<一般メソッド(method)>
insertCoins 機能
… 引数に指定された金額だけ自動販売機に投入する
cancel
… 現在の投入額を釣り銭として返却する
purchase
… 100円の商品を1個購入する
  投入金額不足や売切れの場合はその旨を表示する。
insertGoods
… 引数に指定された個数だけ商品を投入する。

■アプリケーションクラス
・中身の初期値が1,000円の財布を1個生成する
・商品の個数が3個の自動販売機を1個生成する
各機能
(1) 硬貨投入 財布から指定金額を取り出して自動販売機に投入する
(2) 商品購入 自動販売機で商品1個を購入して釣り銭を財布に戻す
(3) 硬貨取出 自動販売機に投入した金額を取り出して財布に戻す
(4) 商品投入 自動販売機に指定した個数だけ商品を補充する
(5) 所持金表示 現在の財布の中身を表示する

[実行例]

現在の入金額:0円
1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>5
現在の財布の中身:1000円

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>1
投入する金額を入力して下さい > 100
財布から100円取り出しました。
現在の入金額:100円

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>5
現在の財布の中身:900円

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>2
現在の入金額:0円
財布に0円入れました。

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>5
現在の財布の中身:900円

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>1
投入する金額を入力して下さい > 150
財布から150円取り出しました。
現在の入金額:150円

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>5
現在の財布の中身:750円

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>3
現在の入金額:0円
財布に150円入れました。

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>5
現在の財布の中身:900円

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>1
投入する金額を入力して下さい > 150
財布から150円取り出しました。
現在の入金額:150円

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>5
現在の財布の中身:750円

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>2
現在の入金額:0円
財布に50円入れました。

1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>6
アプリケーションを終了します。

Walletクラス

public class Wallet {
	private int money;
	public Wallet(int money){
		this.money = money > 0 ? money: 0;
	}
	public void insertMoney(int money){
		this.money += money;
		System.out.printf("財布に%d円入れました。%n",money);
	}
	public int takeOutMoney(int money){
		int m=this.money > money ? money : this.money;
		this.money -= m;
		System.out.printf("財布から%d円取り出しました。%n",m);
		return m;
	}
	public void display(){
		System.out.printf("現在の財布の中身:%d円%n", this.money);
	}
}

VendingMachineクラス

public class VendingMachine {
	private int money;
	private int num;
	public VendingMachine(int n){
		this.insertGoods(n);
		this.insertCoins(0);
	}
	public void insertCoins(int money){
		this.money += money;
		System.out.printf("現在の入金額:%d円%n", this.money);
	}
	public int cancel(){
		int m=this.money;
		this.money=0;
		System.out.printf("現在の入金額:%d円%n", this.money);
		return m;
	}
	public int purchase(){
		if(this.money < 100){
			System.out.println("投入金額が足りません");
			return -1;
		}
		if(this.num < 1){
			System.out.println("商品売切れ");
			return -1;
		}
		this.money -= 100;
		this.num--;
		return cancel();
	}
	public void insertGoods(int num){
		this.num+=num;
	}
}

アプリケーションクラス

public class VendingMachineApp {
	public static void main(String[] args) {
		Wallet wallet=new Wallet(1000);
		VendingMachine vm=new VendingMachine(3);
		Scanner s=new Scanner(System.in);
		while(true){
			System.out.print("1. 硬貨投入 / 2. 商品購入 / 3. 硬貨取出 / 4.商品投入 / 5.所持金表示 / 6.終了>");
			int select=s.nextInt();
			switch(select){
			case 1:
				System.out.print("投入する金額を入力して下さい >");
				int money=s.nextInt();
				vm.insertCoins(wallet.takeOutMoney(money));
				break;
			case 2:
				int ret=vm.purchase();
				if(ret != -1){
					wallet.insertMoney(ret);
				}
				break;
			case 3:
				ret=vm.cancel();
				wallet.insertMoney(ret);
				break;
			case 4:
				System.out.print("投入する個数を入力して下さい >");
				int num=s.nextInt();
				vm.insertGoods(num);				
				break;
			case 5:
				wallet.display();
				break;
			case 6:
				System.out.println("アプリケーションを終了します。");
				return;				
			}
		}
	}
}