Javaプログラミング基礎

演習問題 (中級〜上級)

解答は

に提出しなさい。ソースファイル (〜.java) のみを提出。 提出は gFTP 等の ftp ソフトを用いて行う。

問題1

問題1-1

今回(月曜日出題)の問題2 が2台の車のシミュレーションであることに注目する。 このように、2つの同じ種類のものが相互作用するような現象を考えて、 シミュレーションを行うプログラムをつくりなさい。 メソッドmainのあるクラス名は MutualAction1 とし、 ファイル名は MutualAction1.java とする

ソースファイルの先頭に、 そのシミュレーションのタイトルと、 どのような内容かを説明する文章をコメントの形式で書いておくこと。

例えば、つぎのようなシミュレーションが考えられる。

シミュレーションの対象となる「もの」のクラスを定義し、 インスタンスを2つ作ることになる。

問題1-2

問題1-1は2つの物の相互作用であったが、 多くの同じ種類のもの (例えば 10 個) が相互作用するようなシミュレーションを行うプログラムを考えなさい。 問題1-1とは違う題材とすること。 メソッドmainのあるクラス名は MutualAction2 とし、 ファイル名は MutualAction2.java とする

ソースファイルの先頭に、 そのシミュレーションのタイトルと、 どのような内容かを説明する文章をコメントの形式で書いておくこと。

問題2

お金を預かることができる ATM (のようなもの) をプログラムで真似てみることにしよう。 このクラスを ATM とし、 クラス ATM にお金 (クラス Money) を預けることができるとする。

class ATMUser {
    public static void main(String[] args) {
	ATM myATM = new ATM();

	Money money = new Money(1000);
	System.out.println(money.getAmount() + "円預けます。");
	myATM.deposit(money);
	myATM.show();

	System.out.println();
	System.out.println("手元の money の価値を 10000 円に変更します。");
	money.setAmount(10000);
	myATM.show();
    }
}

class ATM {
    Money balance;

    // お金を預かるメソッド
    void deposit(Money m) {
	balance = m;
    }

    // 預かっているお金の残高を表示するメソッド
    void show() {
	System.out.println("ATM: " + balance.getAmount() + "円預かっています。");
    }
}

class Money {
    int amount;

    Money(int a) {
	amount = a;
    }

    void setAmount(int a) {
	amount = a;
    }

    int getAmount() {
	return amount;
    }
}

このプログラムを実行してみる。

$ java ATMUser
1000円預けます。
ATM: 1000円預かっています。

手元の money の価値を 10000 円に変更します。
ATM: 10000円預かっています。

このプログラムでは、1000円のお金を1回しか預けていないはずである (メソッド myATM.deposit) 。 しかし、手元のお金の価値を変更した (メソッド money.setAmount) だけで、 myATM.show() (ATMの残高) の結果が1回目と2回目で異なっている。

このような残高の不正操作は防ぐべきである。 どのようにしたら、一度預けたお金を後から不正に変更することを防ぐことができるか考え、プログラムを修正しなさい。 ファイル名は ATMUser.java とする。