コンピュータ基礎および演習II

演習問題(中級・上級)

解答は earth.mlab.im.dendai.ac.jp/home/submit/1I-Computer2/[初級の出題日]/[学籍番号] のディレクトリに提出しなさい。 ソースファイル (〜.java) のみを提出すること。

ファイルの送信には ftp ソフトを用いる。 Linux の gFTP を使った提出方法 (実験室のマニュアル) を参照すること。

なお、中級・上級問題は楽しめる範囲で取り組めばよい。

問題1

int 型の配列を用意し適当な数を複数用意しておく。
(例: int[] a = new int[] {15, 9, 12, 10, 6, 8, 16, 5, 13, 14};)

コマンドライン引数で与えられた数が配列の何番目にあるか探し、 表示するプログラムを書きなさい。 プログラム名は IndexSearcher とする。

例えば、次のように実行したとする。

java IndexSearcher 8

8 は配列の要素 a[5] にあるので、結果は 5 と表示されれば良い。

このプログラムでは、 配列から与えられた数を探すメソッド indexOf を定義し、 main から呼び出すように作る。 メソッド indexOf は引数として、検索の対象となる配列と、 検索したい int 型の数を受け取り、 見つかった要素の添字を返すようにする。 また、見つからない場合 -1 を返すこととする。

具体的なプログラムの枠組みは次のようになるはずである。

class IndexSearcher {
    public static void main(String[] args) {
        int[] a = new int[] {15, 9, 12, 10, 6, 8, 16, 5, 13, 14};

        int n = Integer.parseInt(args[0]);
        System.out.println(n + "は" + indexOf(a, n) + "番目に見つかりました");
    }

    static int indexOf(int[] target, int key) {
        // ......
        // メソッド indexOf の中身をここに書く
        // ......
    }
}

問題2

int 型の配列を用意し適当な数を複数用意しておく。
(例: int[] a = new int[] {15, 9, 12, 10, 6, 8, 16, 5, 13, 14};)

配列の中から最大の値を探し表示するプログラムを書きなさい。 この例の値で初期化された配列であれば 16 が表示されれば良いことになる。 プログラム名は MaxSearcher とする。

このプログラムは、 配列から最大値を探し表示するメソッド printMax を定義し、 main から呼び出すように作る。 printMax は引数として配列を受け取り最大値を表示するのみで、 結果の値は返さないメソッドとして作る。

なお、配列から最大または最小の要素を探す方法は 配列の回の例題 で取り上げている。このプログラムを参考にすると良い。 (今回の問題では、最大/最小であった要素の番号までは求める必要はない。)

問題3

int 型の配列を用意し適当な数を複数用意しておく。
(例: int[] a = new int[] {15, 9, 12, 10, 6, 8, 16, 5, 13, 14};)

平均以上の値が何個あるかを表示するプログラムを作りなさい。 プログラム名は LargeCounter とする。 このプログラムは、次の 2 つのメソッドを用いて作成すること。

問題4

この問題は上級者向けである。

階乗を求めるメソッド factorial を、漸化式の考え方を使って作成したい。 このメソッド factorial の動作は、次の式の右辺を計算することである。

ここでは factorial(n) を計算するのに factorial(n - 1) を使っている。 これに従ってメソッド factorial の定義とすると、 factorial の定義の中に factorial 自身が現れることになる。 このような定義のことを再帰的定義と呼ぶ。

    static int factorial(int n) {
	// この中で factorial(n - 1) を使う
    }

ただし、n が 1 のときは factorial(1) = 1 であり、factorial(n - 1) を使わずに値が定まる。

n = 3 の場合の処理の流れは次のようになる。

factorial(3) を計算しようとすると、factorial(2) が必要になる。
  そこで factorial(2) を計算しようとすると、factorial(1) が必要になる。
    そこで factorial(1) を計算しようとすると、定義から 1 と決まっている。
  よって factorial(2)が計算できて、
そして factorial(3)が計算できる。めでたしめでたし。

さて、 コマンドライン引数で与えられた任意の数の階乗を計算するプログラムを作成しなさい。 プログラム名は FactorialRecursively とする。