Javaプログラミング基礎

演習問題 (中級〜上級)

解答は

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

問題1

問題1-1

財布を表すクラス Wallet を定義しなさい。 財布にはお金以外にカード類や領収書などを収納する機能があるが、 ここではお金を収納する機能にのみ着目する。

クラス Wallet には、少なくとも以下の属性、メソッドがあるものとする。

クラス Wallet の使用例と実行例は以下の通り。

class PersonWithWallet {
    public static void main(String[] args) {
        System.out.println("財布: ");
        Wallet wallet = new Wallet();
        wallet.put(1000);
        wallet.printAmount();
        wallet.get(10000);
	wallet.printAmount();
    }
}

class Wallet {
    // ここを考える
}

実行例:

$ java PersonWithWallet
財布: 
1000 入れました。
-----> 中身は 1000 です。
10000 取り出します。
-----> 10000 もありません。1000 だけ取り出します。
-----> 中身は 0 です。
$

問題1-2

ブタ(pig)の形をした貯金箱(piggy bank)を定義しなさい。 この貯金箱は、お金を収納できるので財布の一種と考えることができるが、 お金を一部だけ取り出すことはできず、壊して全額取り出すことしかできない。

この貯金箱を表すクラス PiggyBank を、 財布を表すクラス Wallet を継承させて作成しなさい。 その際、Wallet に実装されているが Wallet とは動作の異なるメソッドを、 オーバライドして作成することになる。 例えば、get は常に 0 を返すメソッドにする必要がある。

余力のある人は、一度壊したら (= getAll したら)、 それ以降は put もできないようにすること。


class PersonWithWallet {
    public static void main(String[] args) {
        System.out.println("財布: ");
        Wallet wallet = new Wallet();
        System.out.println("1000 入れます。");
        wallet.put(1000);
	wallet.printAmount();
        System.out.println("10000 取り出します。");
        wallet.get(10000);
	wallet.printAmount();
        System.out.println();
        
        System.out.println("貯金箱: ");
        PiggyBank piggyBank = new PiggyBank();
        System.out.println("1000 入れます。");
        piggyBank.put(1000);
        piggyBank.printAmount();
        System.out.println("500 取り出します。");
        piggyBank.get(500);
        piggyBank.printAmount();
        System.out.println("すべて取り出します。");
        piggyBank.getAll();
	piggyBank.printAmount();
        System.out.println("10000 入れます");
        piggyBank.put(10000);
    }
}

class Wallet {
    // ここは問題1-1のものをそのまま使う
}

class PiggyBank extends Wallet {
    // ここを考える
}

実行例:

$ java PersonWithWallet
財布: 
1000 入れます。
-----> 中身は 1000 です。
10000 取り出します。
-----> 10000 もありません。1000 だけ取り出します。
-----> 中身は 0 です。

貯金箱: 
1000 入れます。
-----> 中身は 1000 です。
500 取り出します。
-----> 一部だけ取り出すことはできません。
-----> 中身は 1000 です。
すべて取り出します。
-----> 貯金箱を壊して全額取り出しました。この貯金箱はもう使えません。
-----> 中身は 0 です。
10000 入れます。
-----> 壊してしまったのでお金を入れられません。
$

問題2

会社の従業員の給与計算を行うプログラムを考えなさい。

従業員には正社員とアルバイトの2つの職種があるとし、 正社員とアルバイトでは給与体系に以下のような違いがあるとする。

このような給与計算を行う「正社員」のクラスと、 「アルバイト」のクラスを考えると、 両者には共通した性質があると考えることができる。 そこで、次のような方針でプログラムを設計しよう。

以上の考え方に基づき、クラス Employee, Staff, Arbeit を定義し、 正社員とアルバイトの1ヶ月の給料を計算するプログラムを書きなさい。 (ファイル名 Employment.java) プログラムの大枠は次のとおり。

class Employment {
    public static void main(String[] args) {
	Staff medio = new Staff("電大 メディ男");
	Arbeit denko = new Arbeit("電大 デン子");

	printSalary(medio);
	printSalary(denko);
    }

    private static void printSalary( ........ ) {
	// 9時から18時まで24日間働いたときの1ヶ月の給料を表示
        System.out.println(person.getName() + " さんの1ヶ月の給料は " +
			   person.getMonthlySalary(9,18,24) + " 円です。");
    }
}

class Employee {
    private String name;

    public Employee(String n) {
	name = n;
    }

    public String getName() {
	return name;
    }

    // 始業時間、終業時間、労働日数から1ヶ月の給料を計算
    public int getMonthlySalary(int from, int to, int days) {
	// 正社員とアルバイトで計算方法が異なるため、
	// とりあえず 0 を返すようにしておく
	return 0;
    }
}


// 正社員を表わすクラス Staff の定義をここに書く
class Staff ...........
    ........


// アルバイトを表わすクラス Arbeit の定義をここに書く
class Arbeit ...........
    ........

問題3

問題2と同じように、複数のクラスに共通する性質を記述した、 ベースとなるクラスを定義することが有効な事柄を取り上げ、 プログラムとしなさい。適当な main メソッドも用意すること。 ファイル名は BaseClass.java とする。