Javaプログラミング基礎

演習問題 (中級〜上級)

解答は

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

問題1

「人間」をあらわすクラスを考える。 人間といっても様々な人がいる、ということで次のような人間を考えてみよう。

年齢を問いかけたときの答えとして

という、さばを読んだ年齢を答える人をクラスとして作成することを考える。

このような人間をクラス CheatingPerson として定義し、 自己紹介をさせるようなプログラムを作成しなさい。 このプログラムの実行結果は、 例えば実年齢 35 歳の Maurice White という人物について

Hello, my name is Maurice White. I am 33 years old.

のように、さばを読んだ年齢を含んだ自己紹介を行うようにする。

さばを読む人のクラス CheatingPerson の定義は次のようになる。

class CheatingPerson {
    属性
        名前
        実年齢

    メソッド
        名前と実年齢を受け取り初期化するメソッド ( .... ) {
            ....
        }

        自分の名前を返すメソッド ( .... ) {
            ....
        }

        さばを読んだ年齢を返すメソッド ( .... ) {
            ....
        }
}

また、このクラス CheatingPerson を用いて 自己紹介をさせるメソッド main は次のようになる。

class IntroduceCheatingPerson {
    public static void main(String[] args) {
        CheatingPerson maurice = new CheatingPerson();

        maurice に対して名前と実年齢を登録 ;

        // maurice の自己紹介を行う
        System.out.println("Hello, my name is " + ............... );
    }
}

このプログラムを完成させなさい。 メソッド main のあるクラスは IntroduceCheatingPerson なので、 ファイル名は IntroduceCheatingPerson.java とする。

問題2

問題2-1

以前の演習問題 で可変個数の配列(のようなもの)を扱うプログラムを作成した。 このプログラムの解答例を以下に示す。

class CollectionByArray {
    public static void main(String[] args) {
	int[] content = new int[100];

	// 配列要素全体を -1 (未使用) で初期化
	init(content, -1);

	// 1,9,6 の追加
	add(content, 1);
	add(content, 9);
	add(content, 6);
	print(content);

	// 10 の追加
	add(content, 10);
	print(content);

	printIndexOf(content, 6);
	
	// 6 の削除
	remove(content, 6);
	print(content);

    }

    static void init(int[] content, int a) {
	for(int i = 0; i < content.length; i++)
	    content[i] = a;
    }

    static void add(int[] content, int a) {
	// 配列の要素中から -1 (未使用) を探し、最初に -1 が現れた場所、
        // すなわち意味のある値のある要素の末尾に値を追加
	for(int i = 0; i < content.length; i++) {
	    if(content[i] == -1) {
		content[i] = a;
		return;
	    }
	}

	// 配列要素の最後まで -1 (未使用) が見つからない場合はエラー
	System.out.println("配列に空きがありません。");
    }

    static void remove(int[] content, int a) {
	// 配列の要素中から削除したい値を探し -2 (削除済み) にマーク
	for(int i = 0; i < content.length; i++) {
	    if (content[i] == a) {
		content[i] = -2;
		return;
	    }
	}

	// 配列要素の最後まで削除したい値が見つからない場合はエラー
	System.out.println("削除したい値が見つかりません。");
    }

    static void printIndexOf(int[] content, int a) {
	// 配列の要素中から値を探して表示
	for(int i = 0; i < content.length; i++) {
	    if (content[i] == a) {
		System.out.println(a + " は " + i + " 番目に見つかりました");
		return;
	    }
	}

	// 配列要素の最後まで値が見つからない場合はエラー
	System.out.println("値が見つかりません。");
    }

    static void print(int[] content) {
	// 配列要素を最初から最後まで繰り返す
	for(int i = 0; i < content.length; i++) {
	    // 繰り返しの途中で -1 (未使用) があったら繰り返しを終了
	    if (content[i] == -1)
		break;

	    // -2 (削除済み) 以外の値を表示
	    if (content[i] != -2) 
		System.out.print(content[i] + " ");
	}
	System.out.println();
    }
}

このような可変個数のデータの並びのことを「リスト」(list)という。 このプログラムを改造し、 「リスト」を表わす機能をクラスとして独立させなさい。 クラス名は PrimitiveArrayList とする。 このクラスの内容は以下のようになる。

この設計にもとづき、クラス PrimitiveArrayList を作成しなさい。 なお、(※1)の配列の宣言の部分は次のように変数の宣言のみを行う。

int[] content;

そして、(※2)のメソッド initialize の部分で、 new 演算子を用い実際に配列の中身を生成した後、 中身の値を初期化するようにする。

void initilize() {
    content = new int[100];
    for(int i = 0; i < content.length; i++)
        content[i] = -1;
}

クラス PrimitiveArrayListUser に、メソッド main を作成し、 リストに対して値の出し入れや検索を行いなさい。 プログラム全体のファイル名は PrimitiveArrayListUser.java とする。

プログラム全体の枠組みは次のとおり。

class PrimitiveArrayListUser {
    public static void main(String[] args) {
	PrimitiveArrayList list = new PrimitiveArrayList();
	list.initialize();


        list に対して様々な操作を行う。


    }
}

class PrimitiveArrayList {

    // リストの各要素を格納する属性 content の宣言


    メソッド initilize の宣言 () {
        content の配列を生成し、中身を -1 で初期化する。
    }

    メソッド add の宣言 ( .... ) {
        content に引数で指定された値を追加する。
    }

    メソッド remove の宣言 ( .... ) {
        content から引数で指定された値を削除する。
    }

    メソッド printIndexOf の宣言 ( .... ) {
        content 内から引数で指定された要素を探し、何番目に見つかったか表示する。
    }

    メソッド print の宣言 () {
        リスト全体の内容を表示する。
    }
}

問題2-2

クラス PrimitiveArrayList の機能を拡張し、 リストの内容を小さい順に並び替える機能を追加しよう。 クラス PrimitiveArrayList に、 小さい順に並び替えた結果を表示するメソッド printAscendingOrder を追加しなさい。 クラス PrimitiveArrayList をベースに機能拡張したクラスの名前は、 新たに SortablePrimitiveArrayList とする。 小さい順の並び替えの考え方は 以前の演習問題 と同様である。

また、クラス SortableArrayListUser に、メソッド main を作成し、 リストに対して値の出し入れや並び替えを行いなさい。 プログラム全体のファイル名は SortableArrayListUser.java とする。

問題2-3

クラス PrimitiveArrayList に独自の機能を追加しよう。 クラス PrimitiveArrayList をベースに機能拡張したクラスの名前は、 新たに PrimitiveArrayListPlus とする。

独自の機能とは、例えば次のようなものである。

クラス PrimitiveArrayListPlusUser に、メソッド main を作成し、 追加機能の動作を示すようにメソッドを実行しなさい。 プログラム全体のファイル名は PrimitiveArrayListPlusUser.java とする。