Javaプログラミング基礎

演習問題 (中級〜上級)

解答は

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

問題1

int 型の数 3つを引数として取り、 その中の最大の値を返すメソッド maximum3 を書き、 最大値を表示するプログラムを作成しなさい。 プログラム名は Max3e とする。

なお、3つの数から最大の値を求めるメソッド maximum3 では、 月曜日の例題2に示した 2つの数から最大の値を求めるメソッド maximum を用いて書くこと。

プログラムの大枠は次のようになる。

class Max3e {
    public static void main(String[] args) {
        System.out.println(maximum3(5, 9, 2));
    }

    static int maximum3( ..., ..., ...) {

        // 3つの数から最大の値を返すメソッドをここに書く
        // このメソッドの計算には下のメソッド maximum を利用すること

    }

    static int maximum(int a, int b) {
        if (a > b)
            return a;
        else
            return b;
    }
}

問題2

20名の定期試験の成績が次のようであったとする。

65 72 88 60 67 85 72 98 68 58 75 82 62 51 49 78 94 69 100

このような試験の結果から、 点数の頻度分布を求め下のような図を描くプログラムを書きなさい。 プログラム名は Histogram とする。

点数 :人数
0-9:
10-19:
20-29:
30-39:
40-49:*
50-59:**
60-69:******
70-79:****
80-89:***
90-99:**
100:*

このプログラムは次の方針で作成すること。 20人ぶんの点数を int 型の配列に用意しておき、 次のメソッドを作成すること。

問題3

上の問題の処理の考え方を詳しく考えてみよう。 プログラムは次のようなステップで実行されることになる。

ヒストグラムを描こう

  点数の範囲0〜9に対して、ヒストグラムの一行分を表示 (メソッド histogramLine)
    点数の範囲0〜9の人数をカウント(*) (メソッド countRange)
      配列の最初の要素から最後の要素までをチェックし、点数が範囲内の人数をカウント
  人数分の「*」 を出力

  点数の範囲10〜19に対して、ヒストグラムの一行分を表示 (メソッド histogramLine)
    点数の範囲0〜9の人数をカウント(*) (メソッド countRange)
      配列の最初の要素から最後の要素までをチェックし、点数が範囲内の人数をカウント
  人数分の「*」 を出力

  ...
  (点数の範囲を変えて100点までくりかえす)
  ...

ヒストグラムが描けた

このプログラムでは、 プログラムの開始から終了まで 「配列の最初の要素から最後の要素までをチェックし、 点数がa〜bの範囲の人数をカウント(*)」という処理が、 合計11回行われることになる。 これは、プログラムの処理の効率 (実行速度) が良いとは言えない。

そこで、次のような考え方でヒストグラムを描くプログラムを作成しなさい。 プログラム名は Histogram2 とする。

  1. まず、点数の入った配列と、頻度分布を入れるための配列を用意する。 頻度分布を入れるための配列を count とすると、 count[0] には 0-9 点の人数、 count[1] には 10-19 点の人数、 count[2] には 20-29 点の人数、 … count[10] には 100 点の人数を保存することとする。
  2. メソッド countFrequency を作成する。 このメソッドは、「点数の入った配列」と「頻度分布を入れるための配列」を受け取り、 頻度分布を求める働きをするように作る。
  3. メソッド drawHistogram を作成する。 このメソッドは、「頻度分布の入った配列」を受け取り、 ヒストグラムを描くようにする。
  4. メソッド main からは、 まず countFrequency を実行し一気に頻度分布だけを求めてしまい、 頻度分布が求まったあとで drawHistogram を用いて画面表示を行うようにする。

なお、メソッドの引数に配列を使う場合、 メソッドの実行元の変数とメソッド内の変数は、 同一の配列の実体を示すことに注意しなさい。

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