Javaプログラミング基礎 演習問題

解答は

に提出しなさい。クラスファイル (〜.class) は提出しなくてよい。 提出には gFTP 等の ftp ソフトを用いること。

問題1 (Basic)

1曲の音楽を表すクラスMusicを定義する。このクラスの属性には 以下のものを用意する。

Musicクラスのオブジェクトを指す変数song1とsong2について、 それぞれの指すオブジェクトを入れ替えるプログラムを書きなさい。 メソッド main のあるクラス名は SwapMusic とする。ファイル名は SwapMusic.java となる。

public class SwapMusic {
    public static void main(String[] args) {
        Music song1 = new Music("Life Begins At The Hop", "XTC");
        Music song2 = new Music("Burning With Optimism's Flame", "XTC");

        // ここに song1 と song2 の指すオブジェクトを入れ替えるプログラムを書く

        System.out.println("song1: " + song1.getName() + " by " + song1.getArtist());
        System.out.println("song2: " + song2.getName() + " by " + song2.getArtist());
    }
}

class Music {
    String name;
    String artist;

    Music(String n, String a) {
        name = n;
        artist = a;
    }

    String getName() {
        return name;
    }

    String getArtist() {
        return artist;
    }
}

問題2 (Basic)

2つの適当な文字列を変数に入れておく。 (例: String a = "ball", b = "football";) 1つ目の文字列が、2つ目の文字列に含まれているか否かをチェックして 結果を表示するプログラムを作成しなさい。

文字列の内容を変化させ、含まれている文字列の判定が 正しく行えることを確認しなさい。

メソッド main のあるクラス名は CheckContains とし、 ファイル名は CheckContains.java とする。 また、このプログラムでは CheckContains 以外のクラスを作成する必要はない。

public class CheckContains {
    public static void main(String[] args) {
        String a = "ball";
	String b = "baseball";

        文字列aが、文字列bに含まれているか調べ、
        結果を表示するプログラムをここに書く
    }
}

問題3 (Standard)

複数の曲の中から、最も再生時間の長い曲を選ぶプログラムを作成しなさい。 int の配列の中から最大値を探す方法を参考にするとよい (配列を順に見ていくのは一度にすること)。 最も再生時間の長い曲は1つと仮定してよい。

まず、曲を表す Music クラスを拡張し、属性に曲の長さ (time) を加えること。 次に、最も再生時間の長い曲を選ぶプログラムを main メソッドに作成しなさい。

メソッド main のあるクラス名は LongestSongSearcher とする。 ファイル名は LongestSongSearcher.java となる。

public class LongestSongSearcher {
    public static void main(String[] args) {
        Music[] songs = new Music[13];
        songs[0] = new Music("Life Begins At The Hop", "XTC", 235);
        songs[1] = new Music("Burning With Optimism's Flame", "XTC", 264);
        songs[2] = new Music("Love At First Sight", "XTC", 190);
        songs[3] = new Music("Respectable Street", "XTC", 231);
        songs[4] = new Music("No Language In Our Lungs", "XTC", 299);
        songs[5] = new Music("This Is Pop", "XTC", 169);
        songs[6] = new Music("Scissors Man", "XTC", 289);
        songs[7] = new Music("Towers Of London", "XTC", 323);
        songs[8] = new Music("Battery Brides", "XTC", 438);
        songs[9] = new Music("Living Through Another Cuba", "XTC", 209);
        songs[10] = new Music("Generals And Majors", "XTC", 268);
        songs[11] = new Music("Making Plans For Nigel", "XTC", 269);
        songs[12] = new Music("Are You Receiving Me?", "XTC", 198);

        Music longestSong;
        // もっとも再生時間の長い曲を探し、その曲名とアーティスト名を表示
    }
}

class Music {
    String title;
    String artist;
    int time;        // [秒]

    ....

}

問題4 (Standard)

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

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

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

	System.out.println();
	System.out.println("手元の money の価値を 10000 円に変更します。");
	money.setAmount(10000);
	atm.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回しか預けていないはずである (メソッド atm.deposit) 。 しかし、手元のお金の価値を変更した (メソッド money.setAmount) だけで、 atm.show() (ATMの残高) の結果が1回目と2回目で異なっている。

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

問題5 (Advanced)

問題5-1

前回の例題 で、曲の番号を指定して演奏する JukeBox クラスを取り上げた。 この JukeBox に、曲の番号を指定するのではなく、 曲名の一部を指定することにより演奏するような検索機能を実装しなさい。 mainメソッドを作るクラス名は MusicSearcher1 とし、 ファイル名は MusicSearcher1.java とする。

まず、以前の Music クラスに、 指定された語が曲名に含まれるか調べるメソッド contains(String word) を実装しなさい。 それを JukeBox クラスで利用することにより、 指定した曲の演奏機能を実現しなさい。 JukeBox クラスにはメソッド play(String word) を実装しなさい。

$ java MusicSearcher La
Now playing: Penny Lane by The Beatles
Now playing: Arnold Layne by Pink Floyd
$ 

問題5-2

曲名検索をする際に、複数の語を指定できるようにしなさい。 例えば、word1、word2 が指定された場合は、 その 2単語を曲名に含む曲だけが再生される (AND検索)。 配列を引数にとる play メソッドを実装するとよい。

mainメソッドを作るクラス名は MusicSearcher2 とし、 ファイル名は MusicSearcher2.java とする。

$ java MusicSearcher La old
Now playing: Arnold Layne by Pink Floyd
$ 
public class MusicSearcher2 {
    public static void main(String[] args) {
	JukeBox myJukeBox = new JukeBox(5);

	myJukeBox.setMusic(0, "Kiss", "Prince and The Revolution");
	myJukeBox.setMusic(1, "Jump", "Van Halen");
	myJukeBox.setMusic(2, "S.O.S. (Rescue Me)", "Rihanna");
	myJukeBox.setMusic(3, "Penny Lane", "The Beatles");
	myJukeBox.setMusic(4, "Arnold Layne", "Pink Floyd");

	// args[0] を曲名に含んでいる曲を演奏
	myJukeBox.play(args[0]);
	// args に格納されているすべての語を曲名に含んでいる曲だけを演奏
	myJukeBox.play(args);
    }
}

class JukeBox {
    Music[] songs;

    JukeBox() {
	songs = new Music[10];
    }

    JukeBox(int numberOfSong) {
	songs = new Music[numberOfSong];
    }

    void setMusic(int no, String title, String artist) {
        songs[no] = new Music(title, artist);
    }

    void play(int no) {
        System.out.println("Now playing: " + songs[no].getName() + " by " +
			   songs[no].getArtist());
    }

    // メソッド play(String word) を追加 (問題5-1)

    // メソッド play(String[] words) を追加 (問題5-2)
}

class Music {
    String name;
    String artist;

    Music(String n, String a) {
        name = n;
        artist = a;
    }

    String getName() {
        return name;
    }

    String getArtist() {
        return artist;
    }

    // メソッド contains を追加
}