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

解答は

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

問題1 (Basic)

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

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

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

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

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

問題2 (Basic)

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

曲を表す Music クラスの属性として、

を用意すること。

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

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;        // [秒]

    ....

}

問題3 (Standard)

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

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 とする。

問題4 (Standard)

コマンドライン引数を3つ取り、 辞書順に並び替えて表示するプログラムを書きなさい。 アルファベットからなる文字列のみを対象とする。

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

実行例は以下のようになる。

$ java SortThreeStrings football baseball basketball
baseball basketball football

問題5 (Advanced)

問題5-1

コマンドライン引数から与えられた複数の文字列(任意の個数に対応できること) の中から、 辞書順で最も先頭に来るべき文字列を探し表示するプログラムを書きなさい。 mainメソッドを作るクラス名は SearchFirstString とする。 (ファイル名: SearchFirstString.java)

$ java SearchFirstString driving diving drinking dreaming
diving

問題5-2

コマンドライン引数から与えられた複数の文字列(任意の個数に対応できること) を、 辞書順に並び替えて表示するプログラムを書きなさい。 mainメソッドを作るクラス名は SortString とする。 (ファイル名: SortString.java)

$ java SortString driving diving drinking dreaming
diving dreaming drinking driving

問題6 (Advanced)

問題6-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
$ 

問題6-2

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

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

$ java MusicSearcher La old
Now playing: Arnold Layne by Pink Floyd
$ 
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) を追加 (問題6-1)

    // メソッド play(String[] words) を追加 (問題6-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 を追加
}